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

我在两个名称空间中使用相同的类名,比如说A和B.在包含不同命名空间的类时,包含保护是否应该是唯一的? 我的意思是不能有两个文件名称AFile.h(在不同的目录中)具有相同的包含警卫和声明不同的命名空间?   档案1:      #ifndef AFILE_H      #define AFILE_H      命名空间A {      CAFile类      {...      };      };      #万一      文件2:      #ifndef AFILE_H      #define AFILE_H      命名空间B {      CAFile类      {...      };      };      #万一     
已邀请:
如果某些代码(直接或间接)需要同时查看A :: CAFile和B :: CAfile,您的警卫需要有所不同。 包含保护由预处理器处理,它对所有类都不了解(更不用说名称空间了)。如果在处理c ++文件时包含这两个文件,并且它们具有相同的标头保护,则只有一个声明将保留在编译器将看到的预处理源中。 看看像Boost文件这样的东西,他们有一些标题守卫的约定(如果我没记错的话)。     
包含保护仅影响预处理器,预处理器不知道C ++并完全忽略命名空间。因此,警卫应该是文件的唯一,而不是命名空间。     
简而言之,这可能是一个好主意。以下是海湾合作委员会如何做到......
#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1
我不知道每个说法使用一个命名空间,但是包含保护对于你的打包接口应该是唯一的(它可以都在一个命名空间内,也可以分布在多个命名空间中)。     
就个人而言,我一直在使用
#pragma once
,因为它在我关心的编译器上得到支持,你可以避免在这里提到的问题。如果你想使用
#include
警卫,那么你可能需要聪明一点。否则
#include
ing
Foo/header.h
可能不起作用,因为你已经
#include
d
Bar/header.h
。 我不同意其他情况下的风格指南,但谷歌建议
<PROJECT>_<PATH>_<FILE>_H_
。虽然这确实意味着如果你将文件复制到不同的路径,你将不得不更新
#include
警卫。     

要回复问题请先登录注册