#define
#define macro的作用域有点类似于C/C++全局静态变量 编译器处理宏的时机是预处理阶段 编译器按文本顺序处理 遇到宏时就定义一个宏变量 假设这种情况 void test() { #define MACRO 1 } int main() { #ifdef MACRO // do some thing #endif } main函数也是看得到MACRO宏的 因为文本顺序上test在前 编译器处理到test时定义了一个宏变量 使得main也能“看见“这个宏 假如把顺序交换 int main() { #ifdef MACRO // do some thing #endif } void test() { #define MACRO 1 } main就看不见MACRO宏了
不同源文件中的宏
不同源文件是看不到互相定义的宏的 除非将宏定义在了头文件中 宏的机制类似于全局变量 一般情况不会暴露给另一个源文件 除非你特意在头文件中暴露了它 #a.c #define CX 1 #b.c int main() { #ifdef CX //不会被执行 因为看不到这个宏 #endif }