允许哪种类型的内容用作C预处理器宏的参数?

时间:2018-02-17 18:31:17

标签: c c-preprocessor

老实说,我很熟悉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););

1 个答案:

答案 0 :(得分:3)

您无法通过提议的方案传递任意文本:

  • C预处理器将读取输入文件,并在剥离注释后将其解析为一系列预处理标记,以作为参数传递给宏。它匹配括号以确定哪些标记构成由,分隔的参数。

  • 包含具有无法识别的转义序列或独立反斜杠的字符串或字符常量的文本不会解析为标准预处理标记。 macro(@#$);编译是否依赖于实现。

  • 请注意,您可以通过将宏定义为采用可变数量的参数来解决,问题:

    #define macro(...)