我可以看到
#ifdef <token>
code;
#endif
要包含,但我找不到它包含的任何标题中的定义。是否有其他机制可以定义令牌?
答案 0 :(得分:4)
首先,存在由编译器隐式定义的宏(例如,__cplusplus
)。其中一些是标准的,一些是特定于编译器的扩展。有关完整列表,请参阅compiler manual。
此外,大多数编译器允许在命令行上定义宏。确切的机制取决于编译器,但通常采用-D
或/D
命令行选项的形式。例如,请参阅gcc
manual:
-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
有些编译器提供了方便的工具来确定特定预处理器宏的定义位置。例如,请参阅How to know (in GCC) when given macro/preprocessor symbol gets declared?
答案 1 :(得分:2)
大多数(所有?)编译器允许使用标志定义值(-g在gcc中),也可以由编译器本身设置一些。
答案 2 :(得分:1)
是的,当然,可以使用编译器设置预处理程序指令。例如,gcc允许您在命令行中添加指令,您可以在Visual Studio的项目设置中指定指令。还要考虑__cplusplus
的{{1}}或_LINE_
。那些没有在任何地方定义,但它们存在。同样由MSVS环境设置的_FILE_
或_DEBUG
。