在C#中,#define
指令定义了一个符号,例如,以下行定义了一个符号“DEBUG”:
#define DEBUG
此符号的范围是定义它的文件。
在C ++中,可以定义预处理符号(/ D“DEBUG”)以获得相同的效果。但/ D是项目范围的设置开关。
我的问题是,如何在C ++中定义文件的本地符号?
答案 0 :(得分:7)
#define
可用,但它不会创建符号,它会创建一个预处理器宏,它本质上是一个文本替换操作,它在编译器甚至看到源文件之前发生。
在C ++文件中创建文件本地符号的常用方法是使用匿名命名空间,例如
namespace
{
const int SOME_LOCAL_INT = 3;
const std::string SOME_LOCAL_STRING("Blah");
}
使用匿名命名空间可确保符号在定义它的编译单元外部不可见。但请注意,如果在头文件中定义匿名命名空间,则包含在其中的符号的副本将在包含该头文件的所有C ++文件中可访问,因此最好将匿名命名空间放在.cpp文件中以确保他们确实是当地人。
答案 1 :(得分:2)
如果您希望必须使用标头中的#define
作为该标头中的本地符号,请按以下方式使用:
//file.h
#define DEBUG
//... code
#undef DEBUG // clearing the symbol
#undef
将取消定义先前定义的DEBUG
。因此,如果#include
file.h
位于DEBUG
,则file.h
不会产生任何影响,因为它只是{{1}}的本地影响。