如何在C ++中定义文件范围符号

时间:2011-07-11 06:32:12

标签: c++ c-preprocessor

在C#中,#define指令定义了一个符号,例如,以下行定义了一个符号“DEBUG”:

#define DEBUG

此符号的范围是定义它的文件。

在C ++中,可以定义预处理符号(/ D“DEBUG”)以获得相同的效果。但/ D是项目范围的设置开关。

我的问题是,如何在C ++中定义文件的本地符号?

2 个答案:

答案 0 :(得分:7)

C和C ++中的

#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}}的本地影响。