C预处理器它是如何工作的

C preprocessor how it works

我有以下文件

(它的伪代码,我知道 define,undef 很丑,但我会在某些项目中需要它)

如果我编译这些文件并将它们 link 在一起 - 它似乎工作 - 在 file3,file1 - MYVAL == 1

可以安全地假设预处理器是逐个文件完成的吗?

conf.h:

#define MYVAL 1

src1.c

#include "conf.h"
int maint(int argc, char ** argv) {
    printf("%d", MYVAL);
}

src2.c

#include "conf.h"
void demo() {
    #undef MYVAL
    #define MYVAL 2
    printf("%d", MYVAL);
}

src3.c

  #include "conf.h" 
  void demo2() {
       printf("%d", MYVAL);
  }

问候

当您 #include "conf.h" 它的代码放在 而不是 这一行。这是预处理器的工作。所以,这句define放在每个文件中。

但是 如果你做 #define work(n) funcCall((n))work(5); 然后,如果 funcCall 没有在你的任何文件中定义,它将失败.

是的,预处理器用于每个源文件。它从源文件和所有实际传递给 C 编译器的包含文件生成预处理文件。

当您 #define 包含文件中的某些内容时,它会进入预处理文件。 #defines 在其他源文件中不关心。

预处理是在编译阶段之前按翻译单元完成的(比链接阶段早得多)。在您的情况下,预处理器将根据您包含的 conf.h 头文件在每个 .c 文件中单独扩展该宏。

is it safe to assume this, that the preprocessor stuff is done file-by-file?

基本上你的情况是。您的每个 .c 文件都是一个不同的翻译单元。 (除非它们开始相互包含或其他东西)它们分别进行预处理、编译,然后它们的对象链接在一起。