C++ 即使在名称空间之间,include防护也应该是唯一的吗?

C++ 即使在名称空间之间,include防护也应该是唯一的吗?,c++,namespaces,include,include-guards,C++,Namespaces,Include,Include Guards,我在两个名称空间中使用相同的类名,比如A和B。在声明具有不同名称空间的类时,include卫士是否应该是唯一的 我的意思是,一个file.h(在不同的目录中)不能有两个文件名,具有相同的include-guard并声明不同的名称空间吗 //File 1: #ifndef AFILE_H #define AFILE_H namespace A { class CAFile {... }; }; #endif 简言之,这可能是个好主意。以下是GCC如何

我在两个名称空间中使用相同的类名,比如A和B。在声明具有不同名称空间的类时,include卫士是否应该是唯一的

我的意思是,一个file.h(在不同的目录中)不能有两个文件名,具有相同的include-guard并声明不同的名称空间吗

 //File 1:

 #ifndef AFILE_H 

 #define AFILE_H

 namespace A { 

   class CAFile {...

   }; 

 };

 #endif


简言之,这可能是个好主意。以下是GCC如何做他们的

#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1

我不知道如何使用名称空间,但include-guard应该是打包接口所特有的(可能都在一个名称空间中,也可能分布在多个名称空间中)

> Puffice只影响预处理器,预处理器不知道C++,完全忽略命名空间。因此,保护应该是文件的唯一性,而不是命名空间的唯一性。

如果某些代码(直接或间接)需要同时看到a::CAFile和B::CAFile,则保护需要不同

包含保护由预处理器处理,它对所有类(更不用说名称空间)一无所知。如果处理C++文件时包含了两个文件,并且它们具有相同的头保护,则只有一个声明将保留在编译器将看到的预处理源中。
看看Boost文件之类的东西,它们对头保护有一些约定(如果我没记错的话)。

就我个人而言,我曾经使用过
#pragma
,因为我关心的编译器支持它,你可以避免你在这里提到的那种问题。如果你想使用
#包含
防护,那么你可能需要聪明一点。否则
#include
ing
Foo/header.h
可能无法工作,因为您已经
#include
d
Bar/header.h


在其他情况下,我不同意样式指南,但是。尽管这确实意味着,如果您将文件复制到不同的路径,您将不得不更新
#include
保护。

他的观点是,仅仅为FILE.H使用名为_FILE_H的保护还不够好,因为其他一些include可能会使用相同的保护。虽然预处理器不关心名称空间,但确保std namesapce中vector.h的保护与其他名称空间中vector.h的保护不同是有意义的。@安德鲁·怀特:好的,你说得对,但这又归结为“文件系统中每个文件都是唯一的”,与名称空间无关。是的,他可能会根据文件所在的位置向警卫添加前缀。事实上,包含警卫应该在命名空间上不加区别,因为预处理器忽略了C++命名空间。我很惊讶,一个匿名的白痴孩子用他的时间来否决这个答案。被赶下台的选民会随机选择答案吗?这是我所能看到的唯一解释。@Alf P.Steinbach:也许你的推理是正确的,但我对这种情况的态度要好得多:一般来说,由于很难预测文件的使用(通过维护),因此在整个应用程序中,头保护最好是唯一的,包括依赖项。我不记得BOOST是否有正式的指导原则,但他们的风格相当重:)其他技术包括使用GUID或
#pragma once
指令
#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1