如果我有一个C文件foo.c,同时我给出-DMACRO=1
作为编译的命令行选项。但是,如果在头文件中我也有-D MACRO和#define MACRO的优先级
#define MACRO 2
哪些会优先?
如果我有一个C文件foo.c,同时我给出-DMACRO=1
作为编译的命令行选项。但是,如果在头文件中我也有-D MACRO和#define MACRO的优先级
#define MACRO 2
哪些会优先?
手册说:首先-D和-U为了进行评估,然后将所有 - 包括(第-D)
最好的方法:试试吧。
定义是按照编译器看到它们的顺序存储的,当编译器遇到一个具有相同名称的新宏时,它会用新的宏覆盖前面的宏(至少在gcc中是这种情况)。当发生这种情况时,GCC也会给你一个警告。
你会得到一个错误的宏重新定义。显然-D
首先被定义(在源文件被解析之前而不是之后)或者它没有用。 #define
然后是重新定义。
命令行选项应用于从文件读取的任何行之前。文件内容按写入的顺序应用。一般来说,如果任何宏被重新定义,至少会得到一个警告,不管是否涉及命令行。如果重新定义并不重要,警告可能会消失,也许是因为两个定义都是相同的。
来回答这样一个问题,正确的方法是建立一个小的测试案例和尝试。例如,在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行的任何内容之前被处理。
我做的你在做什么的假设,但如果你想在命令行可以为宏提供一个非缺省值,尝试一下本作的宏定义:
#ifndef MACRO
#define MACRO 2
#endif
这样,如果MACRO已被定义(通过命令行参数),它既不会被重新定义也不会导致错误。
当你尝试时发生了什么? – 2010-10-19 06:55:27