2

我在两个命名空间中使用相同的类名,比如 A 和 B。在声明具有不同命名空间的类时,包含保护是否应该是唯一的?

我的意思是不能有两个文件名 AFile.h (在不同的目录中)具有相同的包含保护并声明不同的名称空间吗?

 //File 1:

 #ifndef AFILE_H 

 #define AFILE_H

 namespace A { 

   class CAFile {...

   }; 

 };

 #endif

//File 2:

 #ifndef AFILE_H 

 #define AFILE_H

 namespace B { 

   class CAFile {...

   }; 

 };

 #endif
4

4 回答 4

10

如果某些代码(直接或间接)需要同时查看 A::CAFile 和 B::CAfile,则您的守卫需要有所不同。

包含守卫由预处理器处理,它对所有类都不了解(更不用说命名空间了)。如果在处理 c++ 文件时包含这两个文件,并且它们具有相同的标头保护,则只有一个声明将保留在编译器将看到的预处理源中。

看看诸如 Boost 文件之类的东西,它们对标头保护有一些约定(如果我没记错的话)。

于 2011-03-04T07:25:17.537 回答
5

包含守卫只影响预处理器,而预处理器不知道 C++ 并完全忽略命名空间。所以守卫应该是文件唯一的,而不是命名空间。

于 2011-03-04T07:22:02.180 回答
0

简而言之,这可能是一个好主意。这是海湾合作委员会如何做他们的......

#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1

我不知道每个人都使用命名空间,但包含保护应该是您的打包接口所独有的(它们可能都在一个命名空间内或分布在多个命名空间中)。

于 2011-03-04T07:20:18.587 回答
0

就个人而言,我一直在使用它,#pragma once因为它在我关心的编译器上受支持,并且您可以避免您在此处提到的那种问题。如果你想使用#include守卫,那么你可能需要聪明一点。否则#includeingFoo/header.h可能无法工作,因为您已经#included Bar/header.h

我不同意其他情况下的样式指南,但Google 建议使用<PROJECT>_<PATH>_<FILE>_H_. 虽然这确实意味着如果您将文件复制到不同的路径,您将不得不更新#include防护。

于 2011-03-04T07:38:41.267 回答