1.宏定义在函数内部和外部是一样的(都视为在外部),所以一般不把宏定义放在函数内部以免造成误导;如果一个函数里面只有宏定义 那么该函数相当于不存在。
2.在一个文件或者多个文件中重复定义一个标志编译不会报错,有的编译器会出警告。
3.预编译时对宏定义的处理就是简单的替换,如果说涉及标志重定义的,那么替换时就以最新宏定义为准,关于这点下面作详细说明:
假设现在有a.c,a.h,b.c,b.h四个文件:
1.先在a.h中定义testdef为20,再在b.h中定义testdef为30,然后在a.c中先包含a.h再包含b.h,然后在a.c的main函数中打印
printf("testdef=%dn",testdef);
得到结果为30,因为b.h在a.h后面包含,所以后展开,所以关于testdef的最新宏定义为30;
如果将a.h和b.h的包含顺序反一下则结果也相反。
2.如果b.h先包含,a.h后包含,但是在a.h中包含了b.h,则输出为30,因为在展开a.h的时候又展开了b.h,此时又遇到了testdef的定义为30。
3.在如2的包含顺序中,如果在b.c中定义函数
void testfunc(void)
{
printf("testdef=%dn",testdef);
}
然后在a.c中调用该函数,此时若b.c中只包含了b.h,则函数输出为30,若既包含了a.h也包含了b.h,则按照上诉包含顺序来定输出;由此可见,宏定义替换只是替换为本文件中最新的定义,并不会联想全局(也没得联想)。
4.如2的条件下,在a.c中如下操作:
int main(void *arg)
{
printf("testdef=%dn",testdef);
#define testdef 40
printf("testdef=%dn",testdef);
return 0;
}
则先输出30,再输出40。



