Skip to content

Latest commit

 

History

History
88 lines (59 loc) · 4.46 KB

宏定义#define常见用法总结.md

File metadata and controls

88 lines (59 loc) · 4.46 KB

宏定义#define常见用法总结

常见用法

#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 井号

(17条消息) #(井号)在C/C++的#define宏定义中的特殊用法 _Jacky_Dai的博客-CSDN博客

(17条消息) C语言#define宏中省略号的含义?_adamska0104的博客-CSDN博客_宏定义里面的省略号