[C 语言笔记--Day25] 不只有一个 expression 的 macro

大纲

1. 不只有一个 expression 的 macro
2. 使用 code block 解决会发生什麽问题?
3. do-while 的写法
4. 参考资料

1. 不只有一个 expression 的 macro

如果以下的两个 expression 想要写成 macro:

gets(s);
puts(s);

可以被定义成:

#define ECHO(s) (gets(s), puts(s))

2. 使用 code block 解决会发生什麽问题?

如果写成这样会有问题:

// buggy !
#define ECHO(s) { gets(s); puts(s); }

问题在於使用 if-else 语法时如果写成

if (echo_flag)
    ECHO(str);
else
    gets(str);

会变成

if (echo_flag)
    { gets(s); puts(s); };
else
    gets(str);

这样了话 if 会跟 else 接不上,error

当然也可以写成把ECHO(str); 的分号删掉,这样就没问题了,

不过程序码会变得很奇怪:

if (echo_flag)
    ECHO(str)
else
    gets(str);

3. do-while 的写法

写成这样比较漂亮,因为 do-while 後面本来就需要加分号,

所以前面的问题都可以解决:

#define ECHO(s)     \
    do {            \
        gets(s);    \
        puts(s);    \
    } while(0)

4. 参考资料

C Programming: A Modern Approach, 2/e


<<:  Day21 - LINE Flex Message 文件导读

>>:  Angular Stock登入(一)(Day21)

.NET Core第9天_MVC_Model的引入

在上一篇我们已经知道MVC路由和静态资源导入的方式 因此起手式 从新增专案.net core空专案到...

[day14]Vue.js 网站基本建置

其实今年才刚学Vue.js ,目前的程度大概就是写几个简单的功能而已,要写一个比较完整的网站还是十分...

D9 文件系统核心开始 系统页面功能规划

今天先来规划一下後续的系统架构 先用文字版 等做完了再补上图片 首先使用者进入会先到首页 首页 使用...

Day 11 : PHP - 如何将HTML的内容传送到PHP?POST和GET又该如何选择?

这篇想和大家介绍如何将HTML的内容传送到PHP 因为HTML呈现的是网页的画面,若想做些运算或储存...

[Day 30] - 後期出版流程&从0到1到30的成长+完赛感言!

17King 制造中,订阅一下吧(*´∀`)~♥ 今日影片长度:21 分 05 秒 本集重点条列: ...