【发布时间】:2009-09-09 11:19:36
【问题描述】:
我需要知道 C++ 中的#define 指令是否声明了全局标签?全局是指在每个文件中可见?
我正在使用 Visual Studio 2008,(猜猜这是否重要)
【问题讨论】:
标签: c++ visual-studio c-preprocessor
我需要知道 C++ 中的#define 指令是否声明了全局标签?全局是指在每个文件中可见?
我正在使用 Visual Studio 2008,(猜猜这是否重要)
【问题讨论】:
标签: c++ visual-studio c-preprocessor
不,仅在当前翻译单元中。
即每个具有#define 的文件或包含具有#define 的文件的每个文件都会看到定义。
编辑,以回应您的评论:在每个文件中获取定义,或者将其放在包含在任何地方的头文件中,或者使用一些编译器选项来添加定义。
例如对于 gcc 一个会做的
gcc -Dthedefine=itsvalue
不确定如何在 VC++ 中指定此类包含,但我确信它有可能。
【讨论】:
#define 指令替代 所有后续的令牌字符串 标识符中的出现次数 源文件。标识符是 只有当它形成一个令牌时才被替换。 (请参阅 C++ 语言中的 C++ 标记 参考。)例如,标识符 如果它出现在 注释,在字符串中,或作为一部分 更长的标识符。
它不是全局的,它只针对当前文件/源
【讨论】:
由“#define”定义的符号从指令位置到翻译单元的末尾(或该符号最近的“#undef”)可见。例如,如果你在“file.h”文件中定义了一些东西,这个符号在“file.h”和每个文件中都可以看到,包括“file.h”,直接或间接......
【讨论】:
#define 仅在定义它的翻译单元中工作。由于跨翻译单元共享头文件,这可能是多个文件。
但是,要使其真正全球化,您需要一个 Visual Studio 扩展。 /D 命令行选项允许您将等效的#defines 传递给预处理器,您可以将它们放在项目的属性页中。这几乎是“全球性的”;对于多项目解决方案,您可以使用共享的继承项目属性表。
【讨论】:
它只会在您定义它的文件或包含该文件的文件中定义
【讨论】:
您在一个文件中定义的任何宏只有在您包含包含宏的文件时才会在另一个文件中可见,因此它不会自动全局。通常,出于这个原因,应该在头文件中定义宏,以便您可以执行 #include "headerFile.h"。
【讨论】:
#define 指令将从那个时间点开始定义,直到编译完成——但请记住,每个 .cpp 都算作一个单独的编译单元。
要跨源文件定义某些内容,它需要位于所有源文件都包含的头文件中
【讨论】:
您还可以设置由 .vsprops 文件支持的 Visual Studio 属性表,并将其分配给解决方案中的相关项目。
这将允许您在多个项目中轻松维护多种类型的通用设置,即使它们位于离散的解决方案文件中。
http://msdn.microsoft.com/en-us/library/a4xbdz1e%28VS.80%29.aspx
【讨论】: