【问题标题】:C++ Preprocessor concatenation operationC++ 预处理器串联操作
【发布时间】:2016-03-20 23:35:13
【问题描述】:

我想使用 C++ 预处理器连接器。

#include <iostream>
#include <string>

#define GetBlack(colorName) (color.##colorName)

struct Color
{
    int black = 0;
};

int main()
{
  Color color;
  int c = color.black;
  int d = GetBlack(black); 
}

我得到的错误是

5:35:错误:粘贴“.”并且“黑色”没有给出有效的预处理令牌
16:11:注意:在宏“GetBlack”的扩展中

C++Shell:
http://cpp.sh/3547x

有什么建议吗?

【问题讨论】:

    标签: c++ concatenation c-preprocessor


    【解决方案1】:

    您实际上并不希望在这里进行串联。您只是将预处理“令牌”粘贴到位,因此只需使用:

    #define GetBlack(colorName) (color.colorName)
    

    宏参数名称colorName 已就地展开。那么

    int d = GetBlack(black);
    

    将扩展为

    int d = color.black;
    

    串联是将两个“令牌”合并为一个,请参阅here

    例如,如果成员名为 black_value,但您只想调用 GetBlack(black),则宏定义将类似于:

    #define GetBlack(colourName) colour.colourName##_value;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多