#是字符串连接符
##是两个变量的连接符
/// well.c
#ifndef __WELL_H__
#define __WELL_H__
#define check_cond(exp, err_ret) \
do {\
if (!(exp))\
{\
fprintf(stderr, "%s:%d:%s, not match condition:"#exp"\n",\
__FILE__, __LINE__, __FUNCTION__);\
return err_ret;\
}\
}while\(0);
#define PRINT_VALUE(n) printf("value"#n":%d\n", value##n);
int main()
{
int value1 = 1;
int value2 = 2;
PRINT_VALUE(1); //编译时宏展开成printf("value1=%d\n", value1);
PRINT_VALUE(2); //编译时宏展开成printf("value2=%d\n", value2);
}
#endif
value1=1
value2=2
注意:
#exp等效于"exp",#是字符串连接符
exp1##exp2等效于exp1exp2,##是将两个表达式连接起来成为一个表达式
#和##完全不是一个同等级功能的两者,不要混淆了。
可以通过查看well.c的编译后的文件,查看#和##编译后的内容:
$g++ -E ./well.c > preproc.cpp
$cat -n ./preproc.cpp | less
截图得到#和##编译后的内容
从上面可以看出来
PRINT_VALUE(1);
被编译为上图中的963行
PRINT_VALUE(2);
被编译为上图中的964行
(END)