但是,如果一个函数被封装在了宏定义中,并且,还要在宏定义之外获取这个函数的返回值,应当如何做呢? 2. 实现方法 有两种实现方法: 在宏定义中使用在宏定义之外预先定义的变量; 利用宏定义的特殊格式——({x; y; z;})。 2.1 “全局”变量 我们可以预先定义一个变量,在宏定义函数中直接使用。 #include <stdio...
宏可以用来模拟函数的行为,尽管它们并不是真正的函数。宏可以接受参数,并返回计算结果,从而模拟函数的功能。然而,需要注意的是,宏只是简单的文本替换,没有函数调用时的栈帧开销。 3. 示例:通过宏定义返回一个值 下面是一个使用宏定义来返回两个数中较大值的示例: c #include <stdio.h> // 定义一个...
在上述代码中,宏DEBUG_PRINT接受一个参数msg,并使用printf函数打印出带有行号的调试信息。在main函数中,我们使用DEBUG_PRINT宏打印一条调试信息。 使用宏返回值:宏可以返回一些常量或者表达式的结果。例如,可以定义一个宏来计算两个数的最大值: 代码语言:c 复制#...
C/c++ 宏返回值 C语言用clang或GCC可以有解决方案,在C++中可以用以下方法,主要还是逗号运算符的原理,此方法没有在C语言中试用。 #defineNV_MALLOC(sz)(\Log_debug("NV_MALLOC--->\n file:%s\n func:%s\n line:%d\n",__FILE__,__func__,__LINE__),\malloc(sz)) 可以有多个逗号,最后一个逗号之...
define TWICE(x) \ ({ int _ret; ret = (x) << 1; ret; }) int twice(int c) { return TWICE(c); }
在工程规模较小,不是很复杂,与硬件结合紧密,要求移植性的时候,可采用宏定义简化编程,增强程序可读性...
返回值类型不同:函数可以有返回值,而宏没有返回值。在函数中,可以使用return语句返回一个值,但在宏中不支持return语句。 编译器处理方式不同:函数由编译器在编译时进行编译处理,而宏是在预处理阶段进行处理。因此,编译器可以对函数进行一些优化,如内联优化等。而宏则没有这样的优化机会。
因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0) 和 ({})。下文将一一对三种方式进行分析,比较各自的优劣点。 1.{} 方式 INT_SWAP 宏使用 {} 封装后形态如下: #define INT_SWAP(a,b)\ { \ int tmp = a; \ ...