我在两个名称空间中使用相同的类名,比如A和B.在包含不同名称空间的类时,包含保护是否应该是唯一的?
我的意思是不能有两个文件名称AFile.h(在不同的目录中)包含相同的包含警卫并声明不同的命名空间?
文件1:
#ifndef AFILE_H
#define AFILE_H
命名空间A {
类CAFile
{...
};
};
#ENDIF
文件2:
#ifndef AFILE_H
#define AFILE_H
命名空间B {
类CAFile
{...
};
};
#ENDIF
答案 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
后卫。