我可以看到
#ifdef <token>
code;
#endif
要包含在内,但我在它包含的任何标题中都找不到它。是否有任何其他机制可以定义令牌?
首先,有些宏是由编译器隐式定义的(例如,__cplusplus
)。其中一些是标准的,一些是特定于编译器的扩展。有关完整列表,请参阅您的编译器手册。
此外,大多数编译器允许在命令行上定义宏。确切的机制取决于编译器,但通常采用命令行选项-D
或/D
命令行选项的形式。例如,参见gcc
手册:
-D name
将名称预定义为宏,定义为 1。
-D name=definition
定义的内容被标记和处理,就好像它们出现在“#define”指令中的第三阶段一样。特别是,定义将被嵌入的换行符截断。如果您从 shell 或类似 shell 的程序调用预处理器,您可能需要使用 shell 的引用语法来保护字符,例如在 shell 语法中有意义的空格。
如果您希望在命令行上定义类似函数的宏,请在等号(如果有)之前用括号括住其参数列表。括号对大多数 shell 都有意义,因此您需要引用该选项。使用 sh 和 csh,-D'name(args...)=definition' 有效。
对于 Microsoft Visual C++,请参阅http://msdn.microsoft.com/en-us/library/hhzbb5c8(v=vs.80).aspx
一些编译器提供了方便的工具来确定特定预处理器宏的定义位置。例如,请参阅如何知道(在 GCC 中)何时声明了给定的宏/预处理器符号?
大多数(全部?)编译器允许使用标志定义值(gcc中的-D),也有一些可能由编译器本身设置。
是的,当然,可以使用编译器设置预处理器指令。例如,gcc 允许您在命令行中添加指令,您可以在 Visual Studio 的项目设置中指定指令。也想想__cplusplus
,还是_LINE_
的_FILE_
。这些没有在任何地方定义,但它们存在。也_DEBUG
或UNICODE
哪些是由 MSVS 环境设置的。