ADD_LAYER(int##16 , _t) -> LINK_PARA(int##16 , _t) -> int##16 ##_t -> int16_t 宏替换的结论: 宏展开从外层进行,将外层的参数展开,最后才是对外层展开 最后分析parser中的一组宏: 例如:RULE_PADDING(1,2,3,4,5,6) 参数:rule = 1 参数: ... = 2,3,4,5,6 结果:RULE_PADDING...
-> 展开 TO_STRING2:TO_STRING(a_PARAM(ADDPARAM(1))) //注意此次展开后,PARAM宏名被破坏了,变成了a_PARAM不再是有效的宏名了 -> 展开 ADDPARAM:TO_STRING(a_PARAM(INT_1)) -> 展开 TO_STRING:TO_STRING1(a_PARAM(INT_1)) -> 展开 TO_STRING1:"a_PARAM(INT_1)" 注意:嵌套宏的展开规则与编...
1、一般的展开规律像函数的参数一样:先展开参数,再分析函数,即由内向外展开。 2、当宏中有#运算符的时候,不展开参数。 3、当宏中有##运算符的时候,先展开函数,再分析参数。 4、##运算符用于将参数连接到一起,预处理过程把出现在##运算符两侧的参数合并成一个符号,注意不是字符串。 2、“#”和“##”...
1、先讲一些宏嵌套的展开规则 1、一般的展开规律像函数的参数一样:先展开参数,再分析函数,即由内向外展开。 2、当宏中有#运算符的时候,不展开参数。 3、当宏中有##运算符的时候,先展开函数,再分析参数。 4、##运算符用于将参数连接到一起,预处理过程把出现在##运算符两侧的参数合并成一个符号,注意不是...
嵌入式 C 语言中,宏是在预编译时用宏体内容“文本替换”代码中的宏名的。 先讲一些宏嵌套的展开规则: 1、一般的展开规律像函数的参数一样:先展开参数,再分析函数,即由内向外展开。 2、当宏中有#运算符的时候,不展开参数。 3、当宏中有##运算符的时候,先展开函数,再分析参数。
“##”被称为连接符(concatenation),把宏参数与之前的token(参数/字符串空格等)连接起来。例如 #defineT(x) x##[2]inta[5] = {1,2,3,4,5};printf("%d", T(a)); 注意:##运算的结果 要符合C语言标识符语法(个人理解有可能不对), 上述例子T(a) 展开会报错:[错误] pasting "a" and "[" doe...
在宏定义展开的时候,标记 ‘#’ 用于将 ‘#’ 后面的宏定义函数中的参数转化为对应的字符串。宏定义函数的参数与预处理标记 ‘#’ 之间出现的每一个空格都会被删除,并删除第一个预处理标记之前和最后一个预处理标记之后的空白字符,但是宏定义函数参数中的空格会保留。
1) 带参宏定义中,形参之间可以出现空格,但是宏名和形参列表之间不能有空格出现。例如把:#define MAX(a,b) (a>b)?a:b 写为:#define MAX (a,b) (a>b)?a:b 将被认为是无参宏定义,宏名 MAX 代表字符串(a,b) (a>b)?a:b。宏展开时,宏调用语句:max = MAX(x,y);将变为:max = (...
第二部分为宏(macro),一般为缩略语,其名称(宏名)一般大写,而且不能有空格,遵循C变量命令规则。第三部分“替换文本”可以是任意常数、表达式、字符串等。在预处理工作过程中,代码中所有出现的“宏名”,都会被“替换文本”替换。这个替换的过程被称为“宏代换”或“宏展开”(macro expansion)。“宏代换”是由预...
“##”被称为连接符(concatenation),把宏参数与之前的token(参数/字符串空格等)连接起来。例如: 代码语言:javascript 复制 #defineT(x)x##[2]int a[5]={1,2,3,4,5};cout<<T(a)<<endl;//输出 3 即 a[2] 宏的常见展开错误: 代码语言:javascript ...