新发基金的好处和坏处是什么?新基金的封闭期一般是多久?
新发基金的好处和坏处是什么?新发基金的优点:1、认购费率低:一般
2023/07/06
【资料图】
简单的宏定义我们都会用,比如获取较小值:
#define MIN(a, b) ((a) < (b) ? (a) : (b))
但是,如果一个函数被封装在了宏定义中,并且,还要在宏定义之外 获取这个函数的返回值,应当如何做呢?
有两种实现方法:
在宏定义中使用在宏定义之外预先定义的变量;利用宏定义的特殊格式——({x; y; z;})
。我们可以 预先定义一个变量,在宏定义函数中直接使用。
#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
。所以,我 推荐使用下面的方法。
#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;}
这种方式就很完美了, 无需定义其余变量,直接调用宏定义即可。
#define xxx(a, b, c) ({x; y; z;})
格式的宏定义,最终返回的是 z
的执行结果,z
可以是一个函数,也可以是一个变量,就像上面代码中的 MACRO_ADD_1()
和 MACRO_ADD_2()
;({x; y; z;})
中, (
、{
、 }
、)
一个都不能少。如果不确定被宏定义包装后的函数是否被“翻译”正确,可以生成预编译文件来查看。
对于单文件来说,使用 gcc -E x.c -o x.c.i
即可生成 x.c对应的预编译文件 x.c.i。比如,对于上面的代码,预编译文件中的 main()
函数内容如下:
如果工程的文件比较多的话,推荐使用[cmake:我这样查看源码的预编译信息
Linux内核源码真有用。
标签: