C/C++宏参数含点(成员访问运算符)
C/C++ macro parameter containing dot (member access operator)
如何在包含点(成员访问运算符)的 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
如何让 M(s,c.)
解析为 s.c.x
?
感谢您的帮助!
令牌粘贴运算符##
要求它的两个操作数是有效的预处理令牌,并产生一个预处理令牌。它通常用于将两个标识符连接成一个标识符。
您在这里尝试做的不是令牌粘贴。相反,您正在寻求创建像 s.x
或 s.c.x
这样的表达式,其中 x
部分始终是单个标记。因此,不应使用 ##
运算符。相反,您可以这样做:
#define M(obj, y) obj.y x
当您尝试使用 ##
运算符时,预处理器会尝试将参数 y
中的最后一个标记与标记 x
组合起来。在 c.
中,.
是一个标记,因此结果是 .x
,这不是一个有效的标记。相反,.x
仅作为两个标记的序列有效。
如何在包含点(成员访问运算符)的 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
如何让 M(s,c.)
解析为 s.c.x
?
感谢您的帮助!
令牌粘贴运算符##
要求它的两个操作数是有效的预处理令牌,并产生一个预处理令牌。它通常用于将两个标识符连接成一个标识符。
您在这里尝试做的不是令牌粘贴。相反,您正在寻求创建像 s.x
或 s.c.x
这样的表达式,其中 x
部分始终是单个标记。因此,不应使用 ##
运算符。相反,您可以这样做:
#define M(obj, y) obj.y x
当您尝试使用 ##
运算符时,预处理器会尝试将参数 y
中的最后一个标记与标记 x
组合起来。在 c.
中,.
是一个标记,因此结果是 .x
,这不是一个有效的标记。相反,.x
仅作为两个标记的序列有效。