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)
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"的信息.
你说你正在使用XLib.我只能在我的Xlib.h地方找到两个class用作结构成员的地方:Visual和XWindowAttributes.在这两种情况下,违规成员都包裹如下:
#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)