如何隐式处理C / C ++宏中的参数?

时间:2017-04-19 15:24:36

标签: macros arguments c-preprocessor

我试图阅读和理解用C语言编写的文件(here)并且不太了解C(或者如果它是C ++开头),我想知道如何:

 #define BEGIN yy_start = 1 + 2 *

当这样调用时:

 BEGIN(new_state)

正在运作。我知道BEGIN是一个宏/占位符设置yy_start。但是,我找不到任何关于如何处理传递的参数,operands没有把我带到任何地方。

问题:如果没有明确处理它们,C / C ++宏中的参数如何处理?

2 个答案:

答案 0 :(得分:11)

  

如果没有明确处理它们,C / C ++宏中的参数如何处理?

如果没有使用参数声明宏,则它根本不接受参数。实际上,C明确区分了接受参数的宏和不接受参数的宏。在您的特定情况下,将BEGIN定义为类似对象的宏:

#define BEGIN yy_start = 1 + 2 *

这次调用......

BEGIN(new_state)

...扩展为:

yy_start = 1 + 2 *(new_state)

。特别要注意,只替换宏名称。其后的带括号的标记不是宏调用的一部分,并且不受宏扩展的影响。

答案 1 :(得分:5)

宏BEGIN没有参数,因此生成的代码将是

yy_start = 1 + 2 *(new_state)

在预处理中完成。