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

嵌入式技术

1368人已加入

描述

1. 前言

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

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

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

2. 实现方法

有两种实现方法:

  1. 在宏定义中使用在宏定义之外预先定义的变量;
  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)

static int32_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 语法说明

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

3. 其他

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

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

函数

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

4. 总结

Linux 内核源码真有用。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分