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

时间:2009-07-13 20:51:33

标签: c++ c macros

我正在查看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特定的)吗?它的使用是否被视为良好做法?那个运算符叫什么?

7 个答案:

答案 0 :(得分:16)

Token-pasting operator,由预处理器用于将两个令牌加入单个令牌。

答案 1 :(得分:6)

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

以下是相关信息:

  

16.3.3 ## operator [cpp.concat]

     

1 ##预处理令牌不得   发生在开始或结束时   两种形式的替换清单   宏定义。

     

2如果,在   替换列表,参数是   紧接在之前或之后   ##预处理令牌,参数被相应的替换   参数的预处理令牌   序列

     

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

这不是标准C ++,而是标准C.请查看this Wikipedia article

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

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

这是宏论证的连接,即

GET_ACCESSOR (int, Age);

将用于

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