gcc条件编译

Chr*_*ner 5 unix gcc conditional-compilation

我正在学习条件编译,我认为到目前为止我对它很了解.现在,如果我有代码:

 #ifdef UMP_TO_FILE
    //do something here...
 #endif
Run Code Online (Sandbox Code Playgroud)

我跑:

 gcc myprogram.c -DUMP_TO_FILE
Run Code Online (Sandbox Code Playgroud)

然后,代码块"//在这里做某事......"被编译.现在,我的问题是:

-DUMP_TO_FILE标志究竟是什么?

我认为标志是"-D"并且它定义了宏"UMP_TO_FILE",但是我想确定它的结构和"gcc --help"并没有告诉我任何关于这个的信息,也许我不知道如何在互联网上搜索这个!!

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

pax*_*blo 6

输出man gcc包含这个小片段:

-D名字

预定义name为宏,定义为1.

-D name = definition

定义的内容被标记化并处理,就像它们在#define指令中的翻译阶段3中出现一样.特别是,定义将被嵌入的换行符截断.

如果从shell或类似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因为它的意图更清晰.


Hei*_*bug 4

-D UMP_TO_FILE
Run Code Online (Sandbox Code Playgroud)

定义宏值 UMP_TO_FILE。就像在代码中添加以下行:

#define UMP_TO_FILE
Run Code Online (Sandbox Code Playgroud)

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