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