C宏定义中的特殊用法
在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏、调试宏;宏的条件编译用法及特殊的宏关键字用法。
#undef 限定宏的作用域
一般来讲宏的作用域从 #define 开始直到文件末尾,但如果需要限定宏的作用域就可以用 #undef 来限定宏的作用域,就是该宏只能作用与 #define … #undef 区间内
常见预定义宏
预定义宏也称为编译器内置宏,这些宏并没有定义在哪个头文件中,而是编译器在预处理时会自动处理这些预定义宏,这里介绍几个常用的预定义宏,其中__func__、__FILE__、__LINE__三个宏在调试时经常用到,来定位bug,为了方便可以自己定义一个DEBUG宏: #define DEBUG printf("%s %s %d\n", __FILE__, func, __LINE__);
__DATE__:代表预处理的日期,预处理器会将其替换为"月 日 年"的字符串形式的时间
__TIME__:代表对源文件当前预编译的时间,预处理器会将其替换为“hh:mm:ss”格式的时间
__FILE__:代表当前预编译的源文件文件名,预处理器会将其替换为当前宏所在的文件名
__LINE__:代表当前所在行号,预处理器会将其替换为当前宏所在的行号
__func__:会替换为当前__func__所在的函数名
如下代码:
void test_1() {
printf("预编译的日期:%s\n", __DATE__);
printf("预编译的时间:%s\n", __TIME__);
printf("预编译的文件:%s\n", __FILE__);
printf("当前所在行号:%d\n", __LINE__);
printf("当前所在函数:%s\n", __func__);
}
执行测试结果:
E:\C_demo>Chong.exe
预编译的日期:Jan 29 2020
预编译的时间:16:54:24
预编译的文件:e:\C_demo\Chong.c
当前所在行号:18
当前所在函数:test_1
宏的条件编译
所谓条件编译,也就是在预编译时,预编译器可以通过 “条件编译” 帮你保留某些代码、以及帮你去掉某些代码,第二阶段编译时就只编译保留的代码,条