包含守卫在名称空间之间是否应该是唯一的?

时间:2011-03-04 07:17:47

标签: c++ namespaces include include-guards

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

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

  

文件1:

     

#ifndef AFILE_H

     

#define AFILE_H

     

命名空间A {

     

类CAFile

     

{...

     

};

     

};

     

#ENDIF

     

文件2:

     

#ifndef AFILE_H

     

#define AFILE_H

     

命名空间B {

     

类CAFile

     

{...

     

};

     

};

     

#ENDIF

4 个答案:

答案 0 :(得分:10)

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

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

看看像Boost文件这样的东西,他们对标题保护有一些约定(如果我没记错的话)。

答案 1 :(得分:5)

包含保护仅影响预处理器,预处理器不知道C ++并完全忽略命名空间。因此,防护应该是文件的唯一,而不是命名空间。

答案 2 :(得分:0)

简而言之,这可能是一个好主意。以下是海湾合作委员会的做法......

#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1

我不知道每个说法使用名称空间,但是包含守护程序对于打包的接口应该是唯一的(可以在一个名称空间内或分布在多个名称空间中)。

答案 3 :(得分:0)

就个人而言,我一直在使用#pragma once,因为它在我关心的编译器上得到支持,你可以避免在这里提到的问题。如果你想使用#include警卫,那么你可能需要聪明一点。否则,#include Foo/header.h可能无效,因为您已经#include d Bar/header.h

我不同意其他情况下的风格指南,但是Google recommends <PROJECT>_<PATH>_<FILE>_H_。虽然这确实意味着如果您将文件复制到不同的路径,您将不得不更新#include后卫。