【C语言进阶】C语言带返回值的宏定义

您所在的位置:网站首页 vba返回值是什么 【C语言进阶】C语言带返回值的宏定义

【C语言进阶】C语言带返回值的宏定义

#【C语言进阶】C语言带返回值的宏定义| 来源: 网络整理| 查看: 265

文章目录 1 前言2 宏定义编写3 宏定义分析4 宏定义验证5 经验总结6 更多分享

1 前言

相信大家在实际工作中,一定有遇到需要编写一个宏定义,且希望它能带返回值的场景吧? 比如我之前就遇到一个场景,早期的代码是使用函数实现的功能,现在想换成宏定义,但是又要保留之前调用函数的代码不动,这样我就只能想办法写一个带返回值的宏了。

2 宏定义编写

直接上demo:

#include /* always return 1 */ #define RETURN_MACRO() ({do {} while(0);1;}) #define RETURN_MACRO2() 1 /* return a+b */ #define A_PLUS_B_MACRO(a, b) ({int ret; ret = (a) + (b); ret;}) #define A_PLUS_B_MACRO2(a, b) ({int ret; ret = add((a), (b)); ret;}) int add(int a, int b) { return (a + b); } int main(int argc, const char *argv[]) { int a = 6; int b = 7; printf("Hello world !\n"); printf("RETURN_MACRO: %d\n", RETURN_MACRO()); printf("RETURN_MACRO2: %d\n", RETURN_MACRO2()); printf("a + b = %d\n", A_PLUS_B_MACRO(a, b)); printf("a + b = %d\n", A_PLUS_B_MACRO2(a, b)); return 0; } 3 宏定义分析

为了分析宏定义的写法,我们得知道宏定义最终被展开是什么样的。 我在之前的博文中有提到,使用gcc编译器的话,可以在CFLAGS上加上-save-temps=obj这个编译选项,这样就可以得到预编译处理之后的文件,后缀名是.i。 我们使用编译脚本编译之后,得到.i文件如下:

//前面的内容忽略 # 3 "main.c" 2 # 12 "main.c" # 12 "main.c" int add(int a, int b) { return (a + b); } int main(int argc, const char *argv[]) { int a = 6; int b = 7; printf("Hello world !\n"); printf("RETURN_MACRO: %d\n", ({do {} while(0);1;})); printf("RETURN_MACRO2: %d\n", 1); printf("a + b = %d\n", ({int ret; ret = (a) + (b); ret;})); printf("a + b = %d\n", ({int ret; ret = add((a), (b)); ret;})); return 0; }

从.i文件我们可以看到,宏定义被正常展开,下面确认下功能是否正常。

4 宏定义验证

我们执行编译出来的可执行文件:

return_macro$ ./test Hello world ! RETURN_MACRO: 1 RETURN_MACRO2: 1 a + b = 13 a + b = 13

验证成功。

5 经验总结 在C语言里面,可以使用({aaa; bbb; ccc;})来实现宏定义带返回值;这里的返回值是最后一个;的值。注意里面的()和{}都不能少,否则可能会破坏代码的语法结构,导致得不到正确的答案。 6 更多分享

本项目的所有测试代码和编译脚本,均可以在我的github仓库01workstation中找到,欢迎指正问题。

同时也非常欢迎关注我的CSDN主页和专栏:

【http://yyds.recan-li.cn】

【C/C++语言编程专栏】

【GCC专栏】

【信息安全专栏】

有问题的话,可以跟我讨论,知无不答,谢谢大家。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3