老实说,我对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(...)
关于c - 哪种类型的内容可以用作C预处理程序宏的参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48844577/