我正在学习条件编译,我认为到目前为止我对它理解得很好。现在,如果我有代码:
#ifdef UMP_TO_FILE
//do something here...
#endif然后我跑起来:
gcc myprogram.c -DUMP_TO_FILE然后,代码块“//在这里做点什么...”被编译。现在,我的问题是:
-DUMP_TO_FILE标志到底是做什么的?
我认为这个标志是"-D“,它定义了宏"UMP_TO_FILE",但我想确定语法,"gcc --帮助”没有告诉我任何关于这方面的信息,也许我不知道如何在互联网上搜索这个!!
非常感谢您分享您的知识!
发布于 2011-06-14 09:54:06
man gcc的输出包含以下小片段:
-D name
将name预定义为宏,定义为1。
-D name=definition
definition的内容被标记化并被处理,就好像它们出现在#define指令的转换阶段3中一样。特别是,定义将被嵌入的换行符截断。
如果从shell或类似shell的程序调用预处理器,则可能需要使用shell的引号语法来保护在shell语法中有意义的字符,如空格。
如果您希望在命令行上定义一个类似函数的宏,请在等号(如果有)之前将其参数列表用括号括起来。括号对大多数shell都有意义,因此您需要将该选项引起来。使用sh和csh,-D'name(args...)=definition'就能正常工作。
-D和-U选项的处理顺序与它们在命令行中给出的顺序相同。所有-imacros文件和-include文件选项在处理所有-D和-U选项之后进行处理。
因此,选项-DUMP_TO_FILE相当于将行#define UMP_TO_FILE 1放入您的源代码中(有一些细微的区别,但这里不需要介绍它们)。
顺便说一句,我认为这是相当糟糕的做法。作者使用了一些技巧,使它看起来像一个编译器选项DUMP_TO_FILE,而不是一个预处理器宏。这在某种程度上很聪明,但对于任何想知道UMP_TO_FILE到底是什么意思的源代码的人来说,这都会带来麻烦。
就我个人而言,我更喜欢看-DDUMP_TO_FILE和#ifdef DUMP_TO_FILE,因为它们的意图要清晰得多。
发布于 2011-06-14 09:49:28
-D UMP_TO_FILE定义宏值UMP_TO_FILE。这就像在你的代码中放入下面这行:
#define UMP_TO_FILE如果定义了值(UMP_TO_FILE),将编译#ifdef和#endif之间的代码行。否则就不会了。
发布于 2011-06-14 09:51:53
-d定义了一个符号。我相信大多数编译器也会允许为symbol赋值,就像-dfoo=bar将bar赋值给foo symbol一样。
来自http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options
-D名称将名称预定义为宏,定义为1。
-D name=definition定义的内容被标记化和处理,就好像它们出现在`#define指令的翻译阶段3中一样。特别是,定义将被嵌入的换行符截断。如果从shell或类似shell的程序调用预处理器,则可能需要使用shell的引号语法来保护在shell语法中有意义的字符,如空格。
如果您希望在命令行上定义一个类似函数的宏,请在等号(如果有)之前将其参数列表用括号括起来。括号对大多数shell都有意义,因此您需要将该选项引起来。使用sh和csh,-D‘’name(args...)=definition‘起作用。
-D和-U选项的处理顺序与它们在命令行中给出的顺序相同。所有-imacros文件和-include文件选项在处理所有-D和-U选项之后进行处理。
https://stackoverflow.com/questions/6338244
复制相似问题