c语言api_C语言中被人遗忘的运算符"## ",看完后C语言白学了

0dae80ce042f0d013112ff9c20260518.gif

0 1

前言

cc32b7654d1a2bffd22e89ef317ee842.png

5b28c22be4499df43c0137c2edea8152.png

本文主要介绍的是C语言中被人遗忘的运算符"## ",这是很多学习C语言的人基本都没有用过的一个知识,希望对于广大读者学习C语言有一些帮助,深入了解C语言小知识。

0 2

"##"的官方用法

cc32b7654d1a2bffd22e89ef317ee842.png

它本质上是一个“胶水运算”,用于把参数宏中的“形参”与其它没有天然分割的内容粘连在一起,##就是个粘合剂,将前后两部分粘合起来,也就是有“字符化”的意思。但是“##”不能随意粘合任意字符,必须是合法的C语言标示符。在单一的宏定义中,最多可以出现一次“#”或“##”预处理操作符。如果没有指定与“#”或“##”预处理操作符相关的计算次序,则会产生问题。为避免该问题,在单一的宏定义中只能使用其中一种操作符(即,一份“#”或一个“ ## ”,或都不用)。例如:

89bc11d8cdb88ec7f02adaefde7fa28c.png

实际中,我们想要定义不同的数组可以这样直接这样使用:

defArray(Tel,13);    
//宏展开就是:
//char  userTel[13];

"## "的骚操作之不限参宏定义

可变参数宏的基础知识:

  • "..."只能放在参数宏形参列表的最后;

  • 当用户的参数个数超过了规定的参数个数时,所有多出来的内容会一股脑的由“__VA_ARGS__”所背负;

  • 当用户的参数个数正好等于形参的个数时,"__VA_ARGS__"就等效于一个空字符串

案例展示:

dbc3d081e0d55e022f269eee3e4d7c36.png

当我们使用参数宏的时候在括号里不填写任何内容,最终会展开为仅有默认值的10的情况,即:

result()的展开是(10)

当我们提供了任意的有效值时,则会被展开成逗号表达式,result(逗号表达式) 展开为(逗号表达式);所以result(10)为(10) result(1,2,3,4) 展开为(1,2,3,4);

0 3

"## "的骚操作之C缺省宏函数实现

cc32b7654d1a2bffd22e89ef317ee842.png

这个技巧其实对API的封装特别有效,它允许我们简化函数API的使用,比如在用户忽略的情况下,自动给函数填充某些默认值,而在用户主动提供参数的情况下,替代那些默认值。类似于C++中的函数缺省思想。

假设我们有一个初始化函数,初始化函数允许用户通过结构体来配置一些参数:

typedef struct dataInfo{
...
} data;
int initData(data* ptr);

为了简化用户的配置过程,初始化函数会检查指针ptr是否为NULL,如果为NULL则自动使用默认配置,反之将使用用户定义的配置。此时,我们可以通过宏来提供默认值NULL:

905c91aeb367e50e5900820f6b408cfa.png

0 4

"## "的骚操作之消息处理的默认配置

cc32b7654d1a2bffd22e89ef317ee842.png

有些消息处理函数可以批量的处理某一类消息,而具体选中了哪些消息类别,则通常由二进制掩码来表示,此时我们完全可以借助宏来构建一套语法糖,例如:

6d7455faae0a6de59678bd524d20f724.png

通过宏 add_msg 我们注意到,当用户刻意省略设置msk时,我们就给出默认值 0xFFFF——这很可能表示,在进行消息处理的时候,消息必须严格匹配才能交给对应的处理函数;当用户指定 msk 时,则可能表示某一类消息都交给同一个消息处理函数来处理。

0 5

尾言

cc32b7654d1a2bffd22e89ef317ee842.png

文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。

4b513de02c558450f0acb62a6f0bc620.png 64c2359b0862978f21fbc150e785a589.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值