C++中能否访问包含new成员的XColormapEvent结构体?
在C++中能否访问含
new成员的结构体? 我想要在C++中使用XColormapEvent结构体,其定义如下:
typedef struct { int type; unsigned long serial; Bool send_event; Display *display; Window window; Colormap colormap; Bool new; int state; } XColormapEvent;
可以看到该结构体包含一个名为new的成员变量。请问在C++中能否访问这个成员?以下是简化示例代码及报错情况:
struct Y { int new; }; int main() { Y y; y.new=5; // 报错:expected unqualified-id before »new« }
结论:直接访问会报错,但可通过技巧绕过
new是C++的保留关键字,编译器会优先将其解析为关键字而非结构体成员,因此直接用y.new的写法必然触发语法错误。
如果无法修改结构体定义(比如X11这类第三方库的结构体),可以用以下几种方法访问该成员:
- 通过成员指针访问
先定义指向该成员的指针,再通过指针赋值:
struct Y { int new; }; int main() { Y y; int Y::*new_member = &Y::new; y.*new_member = 5; }
- 取成员地址后间接赋值
通过取成员的内存地址,再解引用赋值:
struct Y { int new; }; int main() { Y y; *(&y.new) = 5; }
- 利用内存偏移直接操作
用offsetof宏计算成员的偏移量,通过内存地址直接赋值:
#include <cstddef> // 引入offsetof struct Y { int new; }; int main() { Y y; *(int*)((char*)&y + offsetof(Y, new)) = 5; }
如果是自己维护的结构体,最稳妥的方式是把成员名改成非关键字(比如is_new),从根源避免这类语法冲突。
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

