2

我可以看到

#ifdef <token>
code;
#endif

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

4

3 回答 3

4

首先,有些宏是由编译器隐式定义的(例如,__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 中)何时声明了给定的宏/预处理器符号?

于 2012-11-05T20:47:02.153 回答
2

大多数(全部?)编译器允许使用标志定义值(gcc中的-D),也有一些可能由编译器本身设置。

于 2012-11-05T20:47:31.170 回答
1

是的,当然,可以使用编译器设置预处理器指令。例如,gcc 允许您在命令行中添加指令,您可以在 Visual Studio 的项目设置中指定指令。也想想__cplusplus,还是_LINE__FILE_。这些没有在任何地方定义,但它们存在。也_DEBUGUNICODE哪些是由 MSVS 环境设置的。

于 2012-11-05T20:46:43.197 回答