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
包含文件中的某些内容时,它会进入预处理文件。 #define
s 在其他源文件中不关心。
预处理是在编译阶段之前按翻译单元完成的(比链接阶段早得多)。在您的情况下,预处理器将根据您包含的 conf.h
头文件在每个 .c
文件中单独扩展该宏。
is it safe to assume this, that the preprocessor stuff is done file-by-file?
基本上你的情况是。您的每个 .c
文件都是一个不同的翻译单元。 (除非它们开始相互包含或其他东西)它们分别进行预处理、编译,然后它们的对象链接在一起。
我有以下文件
(它的伪代码,我知道 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
包含文件中的某些内容时,它会进入预处理文件。 #define
s 在其他源文件中不关心。
预处理是在编译阶段之前按翻译单元完成的(比链接阶段早得多)。在您的情况下,预处理器将根据您包含的 conf.h
头文件在每个 .c
文件中单独扩展该宏。
is it safe to assume this, that the preprocessor stuff is done file-by-file?
基本上你的情况是。您的每个 .c
文件都是一个不同的翻译单元。 (除非它们开始相互包含或其他东西)它们分别进行预处理、编译,然后它们的对象链接在一起。