C 理解宏展开规则中的问题

C 理解宏展开规则中的问题,c,macros,C,Macros,作为一个初学者,我很难理解下面的陈述 a) 如果在更换列表中 函数类似于宏,参数是 紧接着前面或后面的 ##预处理令牌时,参数将替换为相应的 参数的预处理标记 序列 b) 对于类对象和 函数类似于宏调用, 在更换名单公布之前 已重新检查以获取更多宏名称 替换,每个## 在替换中预处理令牌 列表(不是从参数中)被删除 和前面的预处理令牌 与以下内容连接 预处理令牌 请您用一些简单的例子来帮助我理解上面的陈述宏 #define MAKE_EVENT_HANDLER(x) void On##x(vo

作为一个初学者,我很难理解下面的陈述

a) 如果在更换列表中 函数类似于宏,参数是 紧接着前面或后面的 ##预处理令牌时,参数将替换为相应的 参数的预处理标记 序列

b) 对于类对象和 函数类似于宏调用, 在更换名单公布之前 已重新检查以获取更多宏名称 替换,每个## 在替换中预处理令牌 列表(不是从参数中)被删除 和前面的预处理令牌 与以下内容连接 预处理令牌

请您用一些简单的例子来帮助我理解上面的陈述

#define MAKE_EVENT_HANDLER(x)  void On##x(void) {

用法

MAKE_EVENT_HANDLER(MouseClick)
   /* Do stuff */
} // End of function

它如何扩展

void OnMouseClick(void) { /* Do stuff */ }

#define MAKE_EVENT_HANDLER(x)  void On##x(void) {

用法

MAKE_EVENT_HANDLER(MouseClick)
   /* Do stuff */
} // End of function

它如何扩展

void OnMouseClick(void) { /* Do stuff */ }

wikipedia有一个很好的说明->

wikipedia有一个很好的说明->

不久前,我写了几篇关于预处理器的文章。它们既包含技术内容,也包含民间传说。第2部分介绍了#和##运算符

第1部分:


第2部分:

不久前,我写了几篇关于预处理器的文章。它们既包含技术内容,也包含民间传说。第2部分介绍了#和##运算符

第1部分:


第二部分:

别忘了b部分。另外,C,而不是C++。为了清晰起见,请不要忘记b部分。另外,C,而不是C++。1为了清晰起见。是的……但是下面的语句的意思是什么“只有类似函数的参数才能粘贴到宏中,并且这些参数不会首先被解析用于宏替换,因此出现了以下有点不直观的行为:”我不确定“类似函数的参数”是什么意思。如果两个操作数都不是函数宏的参数,则使用##是没有用的。参数被替换一次,然后在再次尝试替换之前处理#。(与我们期望的替换递归发生直到耗尽)是的……但是下面的语句的意思是什么“只有类似函数的参数才能粘贴到宏中,并且这些参数不会首先被解析为宏替换,因此出现了以下有点不直观的行为:“我不确定“类似函数的参数”。如果两个操作数都不是函数宏的参数,则使用##是没有用的。这些参数被替换一次,那么在再次尝试替换之前将对##进行处理。(与我们期望的替换递归发生,直到耗尽为止)第二部分很有用我总是忘记这些规则第二部分很有用我总是忘记这些规则