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;
我想使用 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;