【问题标题】:`Is defining a macro via -D option ALWAYS equivalent to #define MACRO (except precedence)`通过 -D 选项定义宏总是等同于#define MACRO(优先级除外)
【发布时间】:2013-05-03 10:36:23
【问题描述】:

当我通过 Makefile 添加宏时,我有一段第三方代码的工作方式不同,例如-DMacro 而不是在顶级头文件中执行 #define MACRO (正如他们的文档所暗示的,这包含在所有文件中)。

如果以不同的方式定义它是否有任何差异,我在 Google 上搜索,但除了 Precedence of -D MACRO and #define MACRO 之外,我想不出太多。

在开始调试和确定问题之前,我想知道是否遗漏了有关制作文档/C 标准的任何内容。

感谢您的任何回答。

【问题讨论】:

  • 编译行上的-D 和头文件中的#define 之间的区别在于(a)它是为所有编译定义的,而头文件可能不包含在所有源文件中,并且( b) 在每个源文件处理开始之前之前定义。 #define 出现的顺序(在其他头文件之前或之后等)很容易对预处理器处理代码的方式产生很大影响。您可以使用编译器的-E 标志(大多数编译器支持它)或类似的来显示预处理输出并进行比较。

标签: macros makefile


【解决方案1】:

通常,它是完全相同的,但make 和 ISO 标准都对此没有任何说法。这取决于编译器本身,有些甚至可能没有-D 选项。

对于make,它只是运行带有任何选项的命令(例如gcc)。 ISO 没有指定关于如何运行编译器的任何内容,只是编译器(以及它创建的东西)的行为方式。

对于gcc,可以在here 中找到预处理器选项,因此它看起来#define 相同。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多