C代码中`#define`的位置是否重要?

Vij*_*vda 0 c compiler-errors c-preprocessor

我的印象是,#define并且#include可以在我们的代码中的任何地方写入,只要它们在预处理器在将宏提取到编译器之前处理宏时不会产生任何语法错误.

我运行了以下代码:

#include <stdio.h>

int main(void) {
    int B = A;
    #define A 4
    printf("%d", B);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它产生了以下错误:

prog.c:在函数'main'中:prog.c:4:13:错误:'A'未声明(在此函数中首次使用)int B = A; ^ prog.c:4:13:注意:每个未声明的标识符仅针对它出现的每个函数报告一次

但是,当我这样做时,它的工作原理!

#include <stdio.h>

int main(void) {
    #define A 4
    int B = A;
    printf("%d", B);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不知道我在这里缺少什么,但为什么编译器会给出"未声明的A"这样的错误?

是这样,当预处理器读取的行#define A 4,将开始更换任何A4 从代码的后续行

Sto*_*ica 9

C文件在预处理阶段和编译阶段从上到下进行解析.(注意:正如MSalters指出的那样,每个阶段都在顶部单独开始).

A看到令牌defined 之前,预处理器不会被替换.

是这样当预处理器读取#define A 4行时,它将开始用后续代码行替换任何A和4?

是.你没有错过多少.

  • 也许为了明确起见:预处理阶段从上到下运行,然后编译阶段才从顶部开始。 (2认同)