我们可以预先定义一个变量,在宏定义函数中直接使用。 #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(...
返回值类型不同:函数可以有返回值,而宏没有返回值。在函数中,可以使用return语句返回一个值,但在宏中不支持return语句。 编译器处理方式不同:函数由编译器在编译时进行编译处理,而宏是在预处理阶段进行处理。因此,编译器可以对函数进行一些优化,如内联优化等。而宏则没有这样的优化机会。 编译时错误检查不同:由于...
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)) 可以有多个逗号,最后一个逗号之...
C语言带返回值的宏 C语⾔带返回值的宏define TWICE(x) \ ({ int _ret;ret = (x) << 1;ret;})int twice(int c){ return TWICE(c);}
define TWICE(x) \ ({ int _ret; ret = (x) << 1; ret; }) int twice(int c) { return TWICE(c); }
如果setjmp()直接调用,返回值为 0。 如果setjmp()是通过longjmp()调用返回的,返回值是由longjmp()设置的非 0 值。 实例 下面的实例演示了 setjmp() 宏的用法。 实例 #include<stdio.h>#include<setjmp.h>staticjmp_bufbuf;voidsecond(void){printf("second\n");// 打印longjmp(buf,1);// 跳回setjmp的调...
通常情况下,程序成功执行完一个操作正常退出的时候会带有值 EXIT_SUCCESS。在这里,EXIT_SUCCESS 是宏,它被定义为 0。 如果程序中存在一种错误情况,当您退出程序时,会带有状态值 EXIT_FAILURE,被定义为 -1 #include<stdio.h>#include<stdlib.h>main(){intdividend=20;intdivisor=4;if(divisor==0){fprintf(st...
1) 在第一个宏定义中,"name"和第一个"_"之间,以及第2个"_"和第二个"type"之间没有被分隔,所以预处理器会把name_##type##_type解释成3段: “name_”、“type”、以及“_type”,这中间只有“type”是在宏前面出现过的,所以它可以被宏替换。
带参数的宏定义 宏定义可以带参数,类似于函数的调用,但是它是在编译时进行替换的。这样可以方便地重用一段代码,并且可以根据参数不同生成不同的代码。例如:在上述代码中,宏定义 MAX(a,b) 带有两个参数 a 和 b,它的作用是返回这两个参数的最大值。在 main 函数中,我们调用了 MAX(x, y) 宏定义,它...