-D MACRO和#define MACRO的优先级

man*_*ide 11 c gcc c-preprocessor

如果我有一个C文件foo.c而我已经给出-DMACRO=1了编译命令行选项.但是,如果我在头文件中也有

#define MACRO 2
Run Code Online (Sandbox Code Playgroud)

哪些优先权?

RBe*_*eig 8

命令行选项适用于从文件读取的任何行之前.文件内容按写入顺序应用.通常,如果重新定义任何宏,则至少会收到警告,无论是否涉及命令行.如果重新定义无关紧要,警告可能会被静音,可能是因为两个定义都相同.

回答这样的问题的正确方法是构建一个小测试用例并尝试它.例如,在q3965956.c中输入以下内容:

#define AAA 2
AAA
Run Code Online (Sandbox Code Playgroud)

并通过C预处理器运行它,可能有gcc -E:

C:>gcc -DAAA=42 -E q3965956.c
# 1 "q3965956.c"
# 1 ""
# 1 ""
# 1 "q3965956.c"
q3965956.c:1:1: warning: "AAA" redefined
:1:1: warning: this is the location of the previous definition

2

C:>

您可以从输出中看到宏扩展到#define文件中给出的值.此外,您可以从#指令序列中看到内置定义和命令行都在第1行的任何内容之前处理q3965956.c.


Mat*_*att 8

我正在假设您正在做什么,但是如果您想从命令行提供该宏的非默认值,请尝试以下宏定义:

#ifndef MACRO
#define MACRO 2
#endif
Run Code Online (Sandbox Code Playgroud)

这样,如果已经定义了MACRO(通过命令行参数),它既不会被重新定义也不会导致错误.


Dav*_*own 5

定义按照编译器看到它们的顺序存储,当编译器遇到同名的新宏时,它会用新宏覆盖前一个宏(至少在 gcc 中是这种情况)。发生这种情况时,GCC 也会向您发出警告。


Pet*_*hle 1

手册说:首先按顺序评估所有 -D 和 -U,然后评估所有 -includes (在 -D 部分下)

最好的办法:尝试一下。