如果我有一个 C 文件foo.c,并且我已经将-DMACRO=1
作为命令行选项进行编译。但是,如果在头文件中我也有
#define MACRO 2
其中哪一项优先?
答案 0 :(得分:8)
命令行选项适用于从文件读取的任何行之前。文件内容按写入顺序应用。通常,如果重新定义任何宏,则至少会收到警告,无论是否涉及命令行。如果重新定义无关紧要,警告可能会被静音,可能是因为两个定义都相同。
回答这样一个问题的正确方法是构建一个小测试用例并尝试它。例如,在q3965956.c中输入以下内容:
#define AAA 2
AAA
并通过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
给出的值。此外,您可以从#
指令序列中看到内置定义和命令行都在q3965956.c
的第1行的任何内容之前处理。
答案 1 :(得分:8)
我正在假设您正在做什么,但是如果您想从命令行提供该宏的非默认值,请尝试使用宏定义:
#ifndef MACRO
#define MACRO 2
#endif
这样,如果已经定义了MACRO(通过命令行参数),它既不会被重新定义也不会导致错误。
答案 2 :(得分:4)
定义按编译器看到它们的顺序存储,当编译器遇到具有相同名称的新宏时,它会用新的宏覆盖前一个宏(至少在gcc中就是这种情况)。 GCC也会在发生这种情况时给你一个警告。
答案 3 :(得分:4)
宏重新定义会出错。显然-D
首先被定义(在解析源文件之前而不是之后),或者它没有用处。然后#define
是重新定义。
答案 4 :(得分:1)
手册说:首先按顺序评估所有-D和-U,然后全部 - 包括(在-D部分下)
最好的方法:尝试一下。