C语言如何获取宏定义中函数的返回值

2023-08-25 16:33:21 来源:大川搬砖


(相关资料图)

1. 前言

简单的宏定义我们都会用,比如获取较小值:

#define MIN(a, b)    ((a) < (b) ? (a) : (b))

但是,如果一个函数被封装在了宏定义中,并且,还要宏定义之外 获取这个函数的返回值,应当如何做呢?

2. 实现方法

有两种实现方法:

在宏定义中使用在宏定义之外预先定义的变量;利用宏定义的特殊格式——({x; y; z;})

2.1 “全局”变量

我们可以 预先定义一个变量,在宏定义函数中直接使用。

#include < stdio.h >#include < stdlib.h >#include < string.h >#include < stdint.h >#define MACRO_ADD(a, b) do {    sum = add(a, b); }while(0)staticint32_t add(int32_t a, int32_t b){    return a + b;}int main(int argc, char *argv[]){    int32_t sum = 0;    MACRO_ADD(1, 2);    printf("sum:%dn", sum);    return 0;}

这种方式最大的缺点就是 很不灵活,每次调用宏定义的时候都需要在宏定义之外定义一个固定类型,固定名称的变量,就像上面代码中的 int32_t sum = 0。所以,我 推荐使用下面的方法

2.2 ()

#include < stdio.h >#include < stdlib.h >#include < stdint.h >#define MACRO_ADD_1(a, b) ({add(a, b);})#define MACRO_ADD_2(a, b) ({    int32_t _s = 0;     _s = add(a, b);     _s; })static int32_t add(int32_t a, int32_t b){    return a + b;}int main(int argc, char *argv[]){    int32_t sum = 0;    sum = MACRO_ADD_1(1, 2);    printf("sum 1:%dn", sum);    sum = 0;    sum = MACRO_ADD_2(1, 2);    printf("sum 2:%dn", sum);    return 0;}

这种方式就很完美了, 无需定义其余变量,直接调用宏定义即可

2.2.1 语法说明

形如 #define xxx(a, b, c) ({x; y; z;})格式的宏定义,最终返回的是 z的执行结果,z可以是一个函数,也可以是一个变量,就像上面代码中的 MACRO_ADD_1()MACRO_ADD_2()({x; y; z;})中, ({})一个都不能少

3. 其他

如果不确定被宏定义包装后的函数是否被“翻译”正确,可以生成预编译文件来查看。

对于单文件来说,使用 gcc -E x.c -o x.c.i即可生成 x.c对应的预编译文件 x.c.i。比如,对于上面的代码,预编译文件中的 main()函数内容如下:

如果工程的文件比较多的话,推荐使用[cmake:我这样查看源码的预编译信息

4. 总结

Linux内核源码真有用。

关键词:

上一篇: 饮品加冰需以尊重消费者合法权益为前提
下一篇: 最后一页