我知道在C宏中使用参数时会进行参数预扫描,但是当您使用已经定义的宏时就会发生这种情况。但是,在定义它时,在选择参数名称时是否需要特别注意?预处理程序是否以“原子”方式解析宏,以便不扩展参数名称?
我的意思是,想象一下这种情况:
#define MYVAL {is this safe?}
#define ADDVALUES(MYVAL,YOURVAL) do{(MYVAL)+(YOURVAL);}while(0)
int val=ADDVALUES(1,3);
如何解析ADDVALUES宏?在定义ADDVALUES宏之前,MYVAL是否已扩展?
我尚未阅读有关在宏中选择参数名称的任何警告,因此我倾向于认为在解析宏之前,它们的名称不会扩展(我已阅读有关在宏中命名局部变量,有关宏名称本身,有关吞咽的警告。分号等,但与选择参数名称无关。
参数的范围MYVAL
不同于类对象宏的范围MAYVAL
。引用本标准相关部分6.10.3,p10:
这些参数由可选的标识符列表指定,其范围从标识符列表中的声明扩展到终止#define预处理指令的换行符。
给定示例中的最后一行将扩展为
int val=do{(1)+(3);}while(0);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句