包含点的 C/C++ 宏参数(成员访问运算符)

S.V*_*S.V 1 c c++ arguments c-preprocessor member-access

如何在 C/C++ 宏参数中使用包含点(成员访问运算符)的宏参数?

例子:

#define M(obj,y) obj.y##x
struct S { struct {int x;} c; int x; };
S s;
s.c.x = 1;
s.x = 2;
M(s,)   // works, 2 (resolves to s.x)
M(s,c.) // error: pasting formed '.x', an invalid preprocessing token
Run Code Online (Sandbox Code Playgroud)

怎样才能下定M(s,c.)决心呢s.c.x

感谢您的帮助!

Bri*_*ian 5

令牌粘贴运算符##要求其两个操作数是有效的预处理令牌,并生成单个预处理令牌。它通常用于将两个标识符连接成一个标识符。

您在这里尝试做的不是令牌粘贴。相反,您正在寻求创建类似s.x或 的表达式s.c.x,其中该x部分始终是单个标记。因此,##不应使用该运算符。相反,你可以这样做:

#define M(obj, y) obj.y x
Run Code Online (Sandbox Code Playgroud)

当您尝试使用##运算符时,预处理器会尝试将参数中的最后一个标记y与标记结合起来x。在 中c..是一个令牌,因此结果是.x,它不是一个有效的令牌。相反,.x仅作为两个标记的序列有效。