2010-10-19 45 views
8

如果我有一个C文件foo.c,同时我给出-DMACRO=1作为编译的命令行选项。但是,如果在头文件中我也有-D MACRO和#define MACRO的优先级

#define MACRO 2 

哪些会优先?

+8

当你尝试时发生了什么? – 2010-10-19 06:55:27

回答

1

手册说:首先-D和-U为了进行评估,然后将所有 - 包括(第-D)

最好的方法:试试吧。

4

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

4

你会得到一个错误的宏重新定义。显然-D首先被定义(在源文件被解析之前而不是之后)或者它没有用。 #define然后是重新定义。

7

命令行选项应用于从文件读取的任何行之前。文件内容按写入的顺序应用。一般来说,如果任何宏被重新定义,至少会得到一个警告,不管是否涉及命令行。如果重新定义并不重要,警告可能会消失,也许是因为两个定义都是相同的。

来回答这样一个问题,正确的方法是建立一个小的测试案例和尝试。例如,在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行的任何内容之前被处理。

5

我做的你在做什么的假设,但如果你想在命令行可以为宏提供一个非缺省值,尝试一下本作的宏定义:

#ifndef MACRO 
#define MACRO 2 
#endif 

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