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;};