C++ 预处理器串联操作

C++ Preprocessor concatenation operation

我想使用 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: error: pasting "." and "black" does not give a valid preprocessing token
16:11: note: in expansion of macro 'GetBlack'

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

有什么建议吗?

你实际上不需要在这里串联。您只是将预处理 "token" 粘贴到位,所以只需使用:

#define GetBlack(colorName) (color.colorName)

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

int d = GetBlack(black);

将扩展为

int d = color.black;

连接是为了将两个 "tokens" 合并为一个,参见 here

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

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