代码之家  ›  专栏  ›  技术社区  ›  bsruth

C++中的“x”运算符的目的是什么,它叫什么?

  •  5
  • bsruth  · 技术社区  · 15 年前

    我浏览了DirectX 2009年3月SDK附带的DXUTCore项目,注意到他们没有使用普通的访问器方法,而是使用宏来创建通用访问器,如下所示:

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

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

    7 回复  |  直到 15 年前
        1
  •  17
  •   Michael    15 年前

    Token-pasting operator ,由预处理器用于将两个令牌连接到单个令牌中。

        2
  •  6
  •   Community CDub    7 年前

    这也是标准C++,与什么相反 Raldolpho 规定的。

    有关资料如下:

    16.3.3##操作员[cpp.concat]

    1A ## 不允许使用预处理令牌 任何一种形式的替换列表 宏定义的定义。

    2如果,在 替换列表,参数为 紧接着前面或后面的 预处理令牌时,参数将替换为相应的 参数预处理令牌 序列

    3对于类对象和 函数类似于宏调用, 在更换名单公布之前 替换,每个 ## 在替换中预处理令牌 列表(不是从参数中)被删除 和前面的预处理令牌 与以下内容连接 预处理令牌。如果结果是 令牌可用于进一步的宏 属于

        3
  •  5
  •   Mehrdad Afshari    15 年前

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

        4
  •  3
  •   Randolpho    15 年前

    这不是标准C++,它是标准C校验。 this Wikipedia article

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

    显然,我被“我不是标准C++,它是标准C”所指的意思误解了。许多人在读第一个短语,却没有读第二个短语。我的意图是指出宏是由C++继承的。

        5
  •  2
  •   DrAl    15 年前

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

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

    请注意,MISRA C建议此操作数(和 # 由于编译器依赖的计算顺序,不应使用“stringify”操作数。

        6
  •  2
  •   Kirill V. Lyadvinsky    15 年前

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

        7
  •  1
  •   dmckee --- ex-moderator kitten    15 年前

    它是宏参数的串联,即。

    GET_ACCESSOR (int, Age);
    

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