老实说,我很了解 C 编程语言的语法,但对 C 预处理器的语法几乎一无所知,尽管我有时在编程实践中使用它。
所以问题来了。假设我们有一个简单的宏,它扩展为空:
#define macro(param)
可以放入宏调用构造中的语法有哪些限制?
调用宏时当然不可能使用单个或多个逗号:
macro(,); // won't compile
但是,如果我们将逗号放入括号中,它将被 C 预处理器接受:
macro((,)); // compiles fine
当然,你不能使用注释字符:
macro(//); // compile error
因为据我所知,注释是由预处理器本身处理的。
使用宏时不允许使用未闭合的引号和圆括号:
macro("); // compile error
但 C 语法中未使用的字符可以很好地接受:
macro(@#$); // compiles
即使是外语字符也能正常工作:
macro(бла-бла-бла я пишу по-русски); // compiles too
调用宏时,我可以在大括号中使用随机有效的 C/C++ 代码吗?我可以使用不带大括号的随机有效 C/C++ 代码吗?下面的代码似乎编译得很好:
macro(int a = 5; printf("%d\n", a););
您不能通过您提议的方案传递要忽略的任意文本:
C 预处理器将读取输入文件并将其解析为一系列预处理标记,在剥离注释后,将其作为参数传递给宏。它匹配括号来确定哪些标记构成由 分隔的参数,
.
包含具有无法识别的转义序列或独立反斜杠的字符串或字符常量的文本不会解析为标准预处理标记。无论macro(@#$);
编译依赖于实现。
-
但请注意,您可以解决以下问题,
通过将宏定义为采用可变数量的参数来解决问题:
#define macro(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)