首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >代码宏的一点小知识

代码宏的一点小知识

作者头像
用户2615200
发布2021-09-10 10:50:05
发布2021-09-10 10:50:05
36800
代码可运行
举报
运行总次数:0
代码可运行

本文是一篇关于宏定义的短文

C/C++ 中我们可以定义宏来做一些代码的简化工作,一般我们不推荐使用宏,因为使用过程中很容易出现问题,目前有一些方法可以用来取代宏的部分功能(譬如内联函数),但是仍然有些宏功能现在还没有更可靠方便的替代方法,遇到这些使用情境的话,我们还是需要使用宏.

宏的一个简单应用就是定义重复常量,譬如:

代码语言:javascript
代码运行次数:0
运行
复制
#define MAX_COUNT 1024

通过使用这种常量宏,我们可以较方便的维护代码中常量的变更.

我们也可以定义参数宏,能够起到"模拟"函数等作用:

代码语言:javascript
代码运行次数:0
运行
复制
#define MAX(a, b) ((a) > (b) ? (a) : (b))

上述宏定义了一个 MAX 宏,用以返回两个宏参数中较大的参数,这里需要注意一下,如果你使用带有副作用的宏参数,上面的 MAX 宏会返回意外的结果(因为宏并不是函数,宏本身只是做了代码的替换),譬如你这样使用 MAX 宏:

代码语言:javascript
代码运行次数:0
运行
复制
int a = 0;
int b = 1;
int max = MAX(++a, ++b);

得到的 max 结果是 3, 而不是预期中的 2.

我们也可以定义多行宏,方法就是在每一行的宏定义之后添加 \ 符号(最后一行不用添加 \ 符号):

代码语言:javascript
代码运行次数:0
运行
复制
#define MULTI_LINE_MACRO do {\
++i; \
} while(false);

使用多行宏可以非常大的简化一些格式化(包括重复)代码.

OK,简单寒暄了一点宏的知识,我们现在开始代码找茬:

代码语言:javascript
代码运行次数:0
运行
复制
#define MACRO_1 \
if (true) \
{ \
	return; \
}

#define MACRO_2 \
if (true) \
{ \
    return; \ 
}

上面代码中我定义了两个宏(MACRO_1 和 MACRO_2),代码上看两者似乎是一致的,但是执行编译的话, MACRO_2 却会在最后一行出现错误(MACRO_1 则没有编译错误):

代码语言:javascript
代码运行次数:0
运行
复制
语法错误:“}”

问题出在哪呢?有兴趣的朋友可以仔细找找(不必马上往下看结论)~


我一开始也觉得颇为奇怪,后来仔细查看之后才发现, MACRO_2 中的这一句定义:

代码语言:javascript
代码运行次数:0
运行
复制
return; \ 

\ 符号之后是有空格符的!这导致 MACRO_2 宏不能被编译器正确解析,遂尔造成了上面的编译报错…

看来又是一个宏使用中的陷阱(pitfall),在此简单一记~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档