考虑兼容性一般选择使用do{...}while(0)流控制语句块模式, 当需要函数宏返回时可以考虑使用({})小括号+大括号模式,或直接定义函数 参考资料: 1. 《c语言函数宏的封装方式有哪几种?》:https://zhuanlan.zhihu.com/p/666071306
C语言的多行宏定义 一、多行宏定义的使用 最近在跟STM32L011K4T6低功耗的源代码,发现使用了多行的宏定义来封装函数,记得之前把\给删除掉,编译程序就一直报错。 \是续行操作符,也就是宏定义一行写不完,需要多行写,就需要在每一行的后面加上续行操作符,注意字符\后要紧跟回车键,中间不能有空格或其他字符。
//宏定义写出swap(x,y)交换函数 #define swap(x, y)\ x = x + y;\ y = x - y;\ x = x - y; zigbee里多行define有如下例子 #define FillAndSendTxOptions( TRANSSEQ, ADDR, ID, LEN, TxO ) { \ afStatus_t stat; \ ZDP_TxOptions = (TxO); \ stat = fillAndSend( (TRANSSEQ), ...
如何在C中定义多行宏定义? 请参阅下面的示例,其中我将交换两个变量的值。 do-while(0)结构很不错 代码语言:javascript 复制 #include<stdio.h>#defineswap(x,y,T)do{\Ttemp=(*x);\(*x)=(*y);\(*y)=temp;\}while(0)intmain(void){int a=5;int b=9;printf("Value of a and b before swa...
DISPATCH(),就是说当编译器检测到LV_ITERATE_ROOTS(f) 宏语句时,会自动把这条宏命令替换为后面十几个LV_DISPATCH()的宏语句,LV_DISPATCH()也是宏定义,定义就在第一句 #define LV_DISPATCH(f,t,n) f(t,n),就是LV_DISPATCH(f,t,n) 代表以t,n为参数执行函数名为f的函数。
一、宏定义#define DEF_QUEUE(ITEM_TYPE,NAME) \ typedef struct NAME \ {\ ITEM_TYPE* buffer; \ \ u8 capacity; \ u8 length; \ u8 head; \ u8 tail; \ \ void (*Push)(ITEM_TYPE* src, struct NAME* queue);\ void (*Pop)(ITEM_TYPE* dst, struct NAME* queue);\ void (*Peek)(ITEM...
宏定义,又称为宏代换、宏替换,是C语言预处理指令的一种。它允许程序员为一段代码定义一个标识符(宏名),在编译时,预处理器会将代码中所有的宏名替换为它们所代表的字符串。宏定义通常用于定义常量、函数样式的宏等。 2. 什么是多行宏定义? 多行宏定义是指宏定义的内容跨越了多行代码。在C语言中,由于宏定义...
这时可以使用宏来当做一个"开关",直接操作这个宏就可以实现打印的开关,例如: //#define DEBUG(...)#defineDEBUG printf AI代码助手复制代码 另外,还可以使用几个预定义的宏进行辅助: __FILE__// 文件__FUNCTION__// 函数__LINE__// 行号DEBUG("%s %s %d\n",__FILE__,__FUNCTION__,__LINE__); ...
函数:会带来额外的开销,开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈,这种开销大,函数的参数必须被声明为一种特定的类型。 宏定义:代码规模和速度方面都比函数效率更高,不需要规定特定类型。 2、使用规则 除了最后一行,每行末尾加上 \ ...