C ++中##运算符的用途是什么,它叫什么?

我正在浏览DirectX March 2009 SDK附带的DXUTCore项目,并注意到它们使用宏来创建通用访问器,而不是使用普通的访问器方法,类似于以下内容:

#define GET_ACCESSOR( x, y ) inline x Get##y() { DXUTLock l; return m_state.m_##y;}; ... GET_ACCESSOR( WCHAR*, WindowTitle ); 

似乎##运算符只是将第二个参数中的文本插入到宏中,以使用该文本创建对变量进行操作的函数。 这是C ++中的标准(即不是Microsoft特定的)吗? 它的使用是否被视为良好做法? 那个运营商叫什么?

令牌粘贴运算符 ,由预处理器用于将两个令牌连接成单个令牌。

这也是标准的C ++,与Raldolpho所说的相反。

以下是相关信息:

16.3.3 ##运算符[cpp.concat]

1对于任何一种宏定义forms, ##预处理令牌不应出现在替换列表的开头或末尾。

2如果在替换列表中,参数紧跟在##预处理标记之后或之后,则该参数将替换为相应参数的预处理标记序列。

3对于类似对象和类似函数的宏调用,在重新检查替换列表以替换更多宏名称之前,删除替换列表中的##预处理标记的每个实例(不是来自参数)并进行前面的预处理token与以下预处理标记连接在一起。 如果结果不是有效的预处理标记,则行为未定义。 生成的令牌可用于进一步的宏替换。 ##运算符的评估顺序未指定。

它是一个预处理运算符,用于连接左右操作数(不插入空格)。 我不认为这是微软特有的。

这不是标准C ++,它是标准C.查看这篇维基百科文章 。

这是一个好习惯吗? 一般来说,我讨厌预处理器宏,并认为它们和Goto一样糟糕(如果不是坏的话)。

编辑:显然我被误解为“这不是标准C ++,它是标准C”。 许多人正在阅读第一个短语而未能​​阅读第二个短语。 我的意图是指出宏是由C ++从Cinheritance的。

正如Mehrdad所说,它连接了操作数,如:

 #define MyMacro(A,B) A ## B MyMacro(XYZ, 123) // Equivalent to XYZ123 

请注意,MISRA C建议不要使用此操作数(和# ‘stringify’操作数),因为编译器依赖于计算顺序。

它是标准C ++允许的令牌粘贴操作符(详见16.3.3)。 至于良好做法:使用宏不是一个好习惯恕我直言(在C ++中)。

它是宏观参数的串联,即

 GET_ACCESSOR (int, Age); 

将被用于

 inline int GetAge() { DXUTLock l; return m_state.m_Age;};