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

use*_*985 16 c c++ struct naming-conventions

我在使用xlib库时遇到了命名问题:

我正在使用一个名为"class"的结构.我假设这个库主要用于普通的C程序.所以没有问题.

但我用C++编程,这里名称"class"是一个关键字,不能用来表示变量.所以,如果我通过访问struct

myvariable = mystruct->class;

我收到错误:

expected unqualified-id before ‘class’

鉴于我无法更改结构本身,尽管命名冲突,我如何访问此结构成员?

wim*_*ica 17

鉴于我无法更改结构本身,尽管命名冲突,我如何访问此结构成员?

也许你可以使用#define重命名它

#define class xclass
#include "header.h"
#undef class

// ...

myvariable = mystruct->xclass;
Run Code Online (Sandbox Code Playgroud)

  • @iammilind,如果它包含一个名为"class"的成员的结构,则可以为as. (7认同)

iam*_*ind 14

class是C++中的关键字.您不能将其用作变量.

如果你仍想访问它,你可以在C中编写该部分,然后用c编译器编译它:

typedef struct foo {
    bar class;
} foo;

bar *getClassPtr(foo *p) { return &(p->class); }
Run Code Online (Sandbox Code Playgroud)

在C++代码中包含该部分,

extern "C" {
   bar *getClassPtr(foo *);
}
bar &getClass(foo &s) { return *getClassPtr(&s); }
Run Code Online (Sandbox Code Playgroud)

您可能还需要const版本.

您仍然无法在C++代码中包含结构定义,因此您可能必须以foo相同的方式包装其他成员.除非链接时优化可以内联getClassPtr,否则与直接从C++访问struct成员相比,调用中会有一些开销.通常这可以忽略不计,但值得了解.

您可能想查找有关extern"C"的信息.


mu *_*ort 7

你说你正在使用XLib.我只能在我的Xlib.h地方找到两个class用作结构成员的地方:VisualXWindowAttributes.在这两种情况下,违规成员都包裹如下:

#if defined(__cplusplus) || defined(c_plusplus)
    int c_class;
#else
    int class;
#endif
Run Code Online (Sandbox Code Playgroud)

类似的hackery出现在XColormapEvent照顾new会员.

所以你应该没问题,除非你的C++编译器没有定义任何必要的宏; 但这也会破坏通常的extern "C" { ... }包装,所以问题很可能在其他地方.如果您使用的是结构,是不是标准XLIB的一部分,那么你应该用手应用上述黑客,并与图书馆的作者严厉的讨论(如果这是你一气之下自己交谈了一下,我们"我假装不听).

如果您遇到XLib结构问题,请尝试使用成员名称的C++版本:

myvariable = mystruct->c_class;
mynew      = ev->c_new;
Run Code Online (Sandbox Code Playgroud)