gcc条件编译

问题描述:

我正在学习有条件编译,我认为迄今为止我理解得很好。现在,如果我的代码:gcc条件编译

#ifdef UMP_TO_FILE 
    //do something here... 
#endif 

,我跑:

gcc myprogram.c -DUMP_TO_FILE 

然后,代码块 “//做的东西在这里......” 被编译。现在,我的问题是:

什么是-DUMP_TO_FILE标志呢?

我认为这个标志是“-D”,它定义了宏“UMP_TO_FILE”,但我想确定语法,“gcc --help”不会告诉我任何关于这个的东西,也许我不会不知道如何在互联网上搜索这个!

非常感谢您分享您的知识!

+0

我给你一个快速的回答..无论如何@安德鲁怀特是正确的。请在再次询问之前开始接受一些答案。 – Heisenbug 2011-06-14 01:50:09

+0

露西,在您不知道安德鲁和0verbose正在谈论什么的情况下,您最好满足您的要求的答案可以通过在空的绿色标记上打勾来接受他们的左边。回顾你的旧问题是一个好主意,如果任何答案足够好,就这样做。它会说服一些人更容易回答未来的问题 - 当然不是我,我只是为了有机会将我的观点强加给别人,即使花费我钱,我也可能会这样做:-) – paxdiablo 2011-06-14 02:03:52

-D UMP_TO_FILE 

定义宏值UMP_TO_FILE。 这就像把你的下面的代码行:

#define UMP_TO_FILE 

如果值(UMP_TO_FILE)的定义是,在中的#ifdef之间的代码行和#endif将被编译。否则不是。

-d定义了一个符号。我相信大多数编译器也会允许为符号赋值,如-dfoo=bar为foo符号赋值。

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options

-D名 预定义名称作为一个宏,以定义1.

-D名称=定义 定义的内容被标记化和处理,如同它们在翻译相三出现在`#define'指令中。特别是,定义将被嵌入的换行符截断。 如果您从shell或类似shell的程序中调用预处理器,则可能需要使用shell的引用语法来保护shell语法中具有含义的空格等字符。

如果您希望在命令行中定义类似函数的宏,请在等号(如果有)之前将其参数列表与周围的圆括号一起写入。圆括号对大多数炮弹都有意义,所以你需要引用这个选项。用sh和csh,-D'name(args ...)= definition'作品。

-D和-U选项按照它们在命令行上给出的顺序进行处理。所有-imacros文件和-include文件选项都在-D和-U选项之后进行处理。

man gcc输出包含此小片段:

-D名称

name预定义为一个宏,以定义1。

-D名称=定义

定义的内容被标记化和处理,如同它们在#define指令期间平移相三出现了。特别是,定义将被嵌入的换行符截断。

如果您从shell或类似shell的程序中调用预处理器,则可能需要使用shell的引用语法来保护字符,例如在shell语法中有意义的空格。

如果您希望在命令行中定义类似函数的宏,请在等号(如果有)之前将其参数列表与周围的圆括号一起写入。圆括号对大多数炮弹都有意义,所以你需要引用这个选项。用shcsh,-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,因为它意图更清晰。