man*_*ide 11 c gcc c-preprocessor
如果我有一个C文件foo.c而我已经给出-DMACRO=1
了编译命令行选项.但是,如果我在头文件中也有
#define MACRO 2
Run Code Online (Sandbox Code Playgroud)
哪些优先权?
命令行选项适用于从文件读取的任何行之前.文件内容按写入顺序应用.通常,如果重新定义任何宏,则至少会收到警告,无论是否涉及命令行.如果重新定义无关紧要,警告可能会被静音,可能是因为两个定义都相同.
回答这样的问题的正确方法是构建一个小测试用例并尝试它.例如,在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
.
我正在假设您正在做什么,但是如果您想从命令行提供该宏的非默认值,请尝试以下宏定义:
#ifndef MACRO
#define MACRO 2
#endif
Run Code Online (Sandbox Code Playgroud)
这样,如果已经定义了MACRO(通过命令行参数),它既不会被重新定义也不会导致错误.
归档时间: |
|
查看次数: |
2068 次 |
最近记录: |