C++中的命名冲突:如何访问名为 "class" 的结构成员
Naming Conflict in C++: How to access a struct member called "class"
我在使用xlib库时遇到了一个命名问题:
我正在使用一个结构体,它有一个名为"class"的成员。我认为这个库主要用于普通C程序。所以没有问题。
但是我在c++编程,这里的名字"类"是一个关键字,不能用来表示变量。因此,如果我通过
访问结构体 myvariable = mystruct->class;
我得到错误:
expected unqualified-id before ‘class’
既然不能改变结构体本身,那么如何在命名冲突的情况下访问该结构体成员呢?
既然不能改变结构体本身,那么如何在命名冲突的情况下访问该结构体成员呢?
也许你可以用#define来重命名它,比如
#define class xclass
#include "header.h"
#undef class
// ...
myvariable = mystruct->xclass;
class
是c++中的关键字。您不能将其用作变量。
如果你还想访问它,你可以在C中编写这部分代码,然后用C compiler编译它:
typedef struct foo {
bar class;
} foo;
bar *getClassPtr(foo *p) { return &(p->class); }
在你的c++代码中使用
extern "C" {
bar *getClassPtr(foo *);
}
bar &getClass(foo &s) { return *getClassPtr(&s); }
您可能还需要const版本。
您仍然不能在c++代码中包含结构定义,因此您可能必须以相同的方式包装foo
的其他成员。除非链接时间优化可以内联getClassPtr
,否则与直接从c++访问struct成员相比,在调用中会有一些开销。通常情况下,这可以忽略不计,但值得了解。
你可能想找到关于外部"C"的信息
您说您正在使用XLib。我只能在我的Xlib.h
中找到两个地方,其中class
用作结构成员:Visual
和XWindowAttributes
。在这两种情况下,有问题的成员都是这样包装的:
#if defined(__cplusplus) || defined(c_plusplus)
int c_class;
#else
int class;
#endif
在XColormapEvent
中出现了类似的黑客行为来照顾new
成员。
所以你应该很好,除非你的c++编译器没有定义任何必要的宏;但这也会打破通常的extern "C" { ... }
包装以及,所以问题很可能是在其他地方。如果您使用的结构体不是标准XLib的一部分,那么您应该手动应用上述hack,并与库的作者进行严格的讨论(如果是您,那么您可以愤怒地自言自语,我们将假装没有听到)。
如果您在使用XLib结构体时遇到问题,请尝试使用c++版本的成员名:
myvariable = mystruct->c_class;
mynew = ev->c_new;
class是c++中的保留关键字,不能用作变量名。您必须重命名变量
在vc++中,您可以使用Microsoft扩展关键字:__identifier
int __identifier(float);
__identifier(float) = 10.4f;
MSDN说它只适用于/clr (Managed c++),但事实并非如此。它甚至存在于VC6
由于class
是c++中的关键字,如果使用它,编译器会报错
也许你可以创建一个"包装器"结构(在C中),允许访问错误的结构,如
typedef struct Wrapper_ {
faultyStruct * mystruct ;
faultyStructClass * cls ;
} Wrapper ;
Wrapper wrap(faultyStruct * s) {
Wrapper w = {s, &(s->class) } ;
}
用你的C编译器编译这个文件,并通过extern "C"
你也可以使用预处理器来重新定义class
(但我不确定#define c++关键字
- C++ 传递指向对象的指针的指针,无法访问成员
- 从不同C++类的成员变量访问成员函数
- 使用 getter 访问成员变量C++
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 通过多个类访问成员时出错
- 如何在使用对象指针时访问成员函数
- 为什么相应成员不能正确访问成员函数指针
- 从两个不同类继承的非虚拟基类的访问成员
- 如何使用 gcc 内联汇编器代码访问成员变量
- 如何使用常数向量访问成员函数
- 访问成员函数中参数的类成员
- C++嵌套结构初始化和访问成员
- 通过指向班级第一个成员的指针访问成员是不确定的行为吗?
- 如何使用C STD :: SET中的迭代器访问成员功能
- 访问成员C 时,结构的向量生成了范围的错误
- 带指针的班级访问成员
- 从聚合类访问成员变量
- 如何访问成员变量 sqlite 回调
- ctypes/C++segfault访问成员变量
- 通过父类型的指针或直接从派生类访问成员函数的差异