C++中的命名冲突:如何访问名为 "class" 的结构成员

Naming Conflict in C++: How to access a struct member called "class"

本文关键字:访问 成员 class 结构 何访问 冲突 C++      更新时间:2023-10-16

我在使用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用作结构成员:VisualXWindowAttributes。在这两种情况下,有问题的成员都是这样包装的:

#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"

在你的c++代码中使用它

你也可以使用预处理器来重新定义class(但我不确定#define c++关键字

是否合法)