我们先来看一个错误:
源码
#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__)
#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line)
#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1 : -1]
unsigned int lcm_count = sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *);
LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *));
编译上述代码出现如下错误: 编译阶段可知的信息:
dev/lcm/mt65xx_lcm_list.c:1365:53: error: size of array 'assertion_failed_at_line_1368' is negative
#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1 : -1]
如果condition为假的话,数组的下标为-1,出现编译报错。这里的condition为lcm_count=-1
该宏巧妙地利用gcc编译器下数组下标为-1时的编译报错。其中,exp为需要检查的表达式。
扩展: # 和 ## 在宏定义中的使用
#include <stdio.h>
/*
*
* # 字符串常量运算符
* ## 标记粘贴运算符 eg: n=34 token##n 等价于 token34
* 都发生在C预处理的阶段
*
*/
#define message_for(a, b) \
printf(#a" and "#b ": is love with each others\n")
#define tokenpaster(n) printf("token"#n" = %d\n", token##n)
int main()
{
message_for(A, B);
printf("######################\n");
int token34 = 100;
tokenpaster(34);
return 0;
}
编译如上代码,输出:
A and B: is love with each others
######################
token34 = 100