({ int _ret; ret = (x) << 1; ret; }) int twice(int c) { return TWICE(c); }
C语言带返回值的宏 C语⾔带返回值的宏define TWICE(x) \ ({ int _ret;ret = (x) << 1;ret;})int twice(int c){ return TWICE(c);}
这种方式就很完美了,无需定义其余变量,直接调用宏定义即可。 2.2.1 语法说明 形如#define xxx(a, b, c) ({x; y; z;})格式的宏定义,最终返回的是z的执行结果,z可以是一个函数,也可以是一个变量,就像上面代码中的MACRO_ADD_1()和MACRO_ADD_2(); ({x; y; z;})中,(、{、}、)一个都不能少。
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)) 可以有多个逗号,最后一个逗号之...
在上述代码中,宏DEBUG_PRINT接受一个参数msg,并使用printf函数打印出带有行号的调试信息。在main函数中,我们使用DEBUG_PRINT宏打印一条调试信息。 使用宏返回值:宏可以返回一些常量或者表达式的结果。例如,可以定义一个宏来计算两个数的最大值: 代码语言:c 复制#...
③宏替换之作替换不做计算,不做表达式求解 ④宏的哑实结合不存在类型,也没有类型转换 ⑤宏展开不占用运行时间,只占用编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值) 2. 宏定义易错点示例总结 #define 第一位置 第二位置 (1)“”内的东西不会被宏替换 ...
「返回类型」 「函数名(函数标识符)」 「形参列表」 「函数主体」 「函数签名」:函数名和形参列表一起构成了函数签名。 形参与实参 函数的形参与实参之间存在两种数值传递方式: 「值传递」:把实参的数值复制给形参,两份数据是互相独立存在的。 「引用传递」:把实参的引用(指针)传递给形参,只存在一份数据,形参本...
C语言程序中,func()指的是Function,表示子例程的一般性名词。在某些编程语言中,它指带返回值的子例程或语句。在一些编程语言中起着关键字的作用。将常用的代码以固定的格式封装(包装)成一个独立的模块,只要知道这个模块的名字就可以重复使用它,这个模块就叫做函数(Function)。函数的本质是一段...
如这个例子所显示的,带参数的宏经常用来作为一些简单的函数使用。MAX类似一个从两个值中选取较大的值的函数。IS_EVEN则类似于另一种函数,该函数当参数为偶数时返回1,否则返回0。 下面的例子是一个更复杂的宏: 代码语言:javascript 复制 #defineTOUPPER(c)('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))...
比较少,甚至于只完成一点操作,如一个乘法语句的操作,则 这部分转换开销就相对较大了,但使用带参数的宏定义就不会 出现这个问 题,因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。 3.减少代码量 有些函数在程序中经常用到,而这些函数又需要返回值,把它封装到一个函数里边还是要返回值,...