c ++ - #ifdef宏

时间:2012-11-05 20:45:41

标签: c++

我可以看到

#ifdef <token>
code;
#endif

要包含,但我找不到它包含的任何标题中的定义。是否有其他机制可以定义令牌?

3 个答案:

答案 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