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

ken*_*yzx 1 c++ c-preprocessor

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

#define DEBUG
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 7

#define 在C和C++中可用,但它不创建符号,它创建一个预处理器宏,它本质上是一个文本替换操作,它发生在编译器甚至看到源文件之前.

在C++文件中创建文件本地符号的常用方法是使用匿名命名空间,例如

namespace 
{
    const int SOME_LOCAL_INT = 3;
    const std::string SOME_LOCAL_STRING("Blah");
}
Run Code Online (Sandbox Code Playgroud)

使用匿名命名空间可确保符号在定义它的编译单元外部不可见.但请注意,如果在头文件中定义匿名命名空间,则包含在其中的符号的副本将在包含该头文件的所有C++文件中可访问,因此最好将匿名命名空间放在.cpp文件中以确保他们确实是当地的.

  • *如果在头文件中定义匿名命名空间,则包含在其中的符号将在包含该头文件*的所有C++文件中可访问.这不完全正确:相同标识符的不同版本将可用.每个翻译单元都有自己的`SOME_LOCAL_INT`,它将是该翻译单元的本地.这在非常量的情况下很重要,因为在未命名的命名空间内修改变量将不会在其他翻译单元的代码中看到. (3认同)
  • 这同样适用于没有名称空间的静态全局成员 (2认同)