#define // 定义一个预处理宏
#undef // 在一个程序块中用完宏定义后,为防止后面标识符冲突需要取消其宏定义
#if // 编译预处理中的条件命令,相当于C语法中的if语句
#ifdef // 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef // 与#ifdef相反,判断某个宏是否未被定义
#elif // 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else // 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif // #if, #ifdef, #ifndef这些条件命令的结束标志
#if defined // 与#if, #elif配合使用,判断某个宏是否被定义
// #ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,如:
#if defined (AAA) && defined (BBB)
// ...
#endif
#if defined (AAA) || VERSION > 12
// ...
#endif
在宏展开的时候会将#后面的参数替换成字符串,调用p(asdfsadf)的时候会将#exp换成"asdfsadf"
#define p(exp) printf(#exp);
将前后两个的单词拼接在一起,调用cat(var, 123)展开后成为var123.
#define cat(x,y) x##y
#@
将值序列变为一个字符,调用ch(a)展开后成为'a'。
#define ch(x) #@x
...
宏定义中的省略号表示一串可变的参数, 这一串参数可用args加以引用。
#define PDEBUG(fmt, args...) printk( KERN_DEBUG "scull: " fmt, ## args)
// 示例
PDEBUG("a=%d, b=%d", a, b);
// 宏展开后
printk( KERN_DEBUG "scull: " "a=%d, b=%d", a, b);
// 如果在args与省略号之间加入逗号,就变成args = a, 而省略号指向的那串参数只包含一个b。
#define TAG "[YOOHAN]"
#define LOG(msg, v...) \
do { \
printf(TAG " : " msg, ##v); \
} while (0); printf("\n")
LOG("set a:%d b:%f", a, b);
(17条消息) C语言中#undef的常用法_诺诺埃里斯·尤克里里的博客-CSDN博客_c语言undef
(17条消息) ifdef和if defined_weixin_34402090的博客-CSDN博客
(17条消息) C语言宏定义中#define中的井号#的使用_rtoax的博客-CSDN博客_define 井号