C++ C+中的命名冲突+;:如何访问名为“的结构成员”;“类”;
我在使用xlib库时遇到命名问题: 我使用的结构有一个名为“class”的成员。我假设这个库主要用于普通C程序。所以没问题 <>但是我在C++编程,这里的“类”是关键字,不能用来表示变量。如果我通过C++ C+中的命名冲突+;:如何访问名为“的结构成员”;“类”;,c++,c,struct,naming-conventions,C++,C,Struct,Naming Conventions,我在使用xlib库时遇到命名问题: 我使用的结构有一个名为“class”的成员。我假设这个库主要用于普通C程序。所以没问题 但是我在C++编程,这里的“类”是关键字,不能用来表示变量。如果我通过 myvariable=mystruct->class 我得到了一个错误: 在'class'之前应为非限定id 如果不能更改结构本身,我怎么能访问这个结构成员,尽管命名冲突?类是C++中的保留关键字,不能用作变量名。你必须重命名变量。 < p> 类< /C> >是C++中的关键字。不能将其用作变量 如果您
myvariable=mystruct->class代码>
我得到了一个错误:
在'class'之前应为非限定id
如果不能更改结构本身,我怎么能访问这个结构成员,尽管命名冲突?
类是C++中的保留关键字,不能用作变量名。你必须重命名变量。 < p> <代码>类< /C> >是C++中的关键字。不能将其用作变量
如果您仍想访问它,可以用C编写该部分代码,然后用C编译器编译:
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的其他成员。除非链接时间优化可以内嵌<代码> GETCLSASPTR < /> >,否则调用中会有一些开销,与直接从C++访问Stutt成员相比。通常情况下,这可以忽略不计,但值得了解
您可能需要查找有关的信息
鉴于我无法更改结构本身,我如何在命名冲突的情况下访问此结构成员
也许你可以用#define,比如
#define class xclass
#include "header.h"
#undef class
// ...
myvariable = mystruct->xclass;
typedef struct Wrapper_ {
faultyStruct * mystruct ;
faultyStructClass * cls ;
} Wrapper ;
Wrapper wrap(faultyStruct * s) {
Wrapper w = {s, &(s->class) } ;
}
在VC++中,可以使用Microsoft extension关键字:
MSDN说它只适用于/clr(托管C++),但事实并非如此。它甚至存在于VC6< P> AS <代码>类< /C> >是C++中的关键字,编译器使用它时会抱怨< < /P>
也许您可以创建一个“包装器”结构(在C中),允许访问错误的结构,比如
#define class xclass
#include "header.h"
#undef class
// ...
myvariable = mystruct->xclass;
typedef struct Wrapper_ {
faultyStruct * mystruct ;
faultyStructClass * cls ;
} Wrapper ;
Wrapper wrap(faultyStruct * s) {
Wrapper w = {s, &(s->class) } ;
}
使用C++编译器编译此文件,并通过 Extn“C”< /C> < /P>将其应用于C++代码中。
您还可以使用预处理器重新定义类
(但我不确定是否定义了C++关键字< /p> < p>你说你使用xLIB。我只能在我的代码< xLIB .H/COD>中找到两个地方:代码> >类< /代码>作为结构成员:<代码> Visual和 XWOWDOWS属性。在这两种情况下,冒犯的成员都包着这样的:
#if defined(__cplusplus) || defined(c_plusplus)
int c_class;
#else
int class;
#endif
类似的黑客行为出现在XColormapEvent
中,以处理新成员
<> P>所以除非你的C++编译器没有定义任何必要的宏,否则你应该是好的,但是这也会打破通常的代码>外部“C”{ }。
wrappers也是如此,所以问题很可能出在其他地方。如果您使用的结构不是标准XLib的一部分,那么您应该手动应用上述破解方法,并与库的作者进行严肃的讨论(如果是您,则愤怒地对自己说几句,我们将假装不听)
如果您在XLIB结构中遇到问题,那么尝试使用成员名称的C++版本:
myvariable = mystruct->c_class;
mynew = ev->c_new;
您可能可以使用相同的布局定义一个结构,但类成员的名称不同,然后将库结构强制转换为您的副本,并以其他名称访问变量…MyStruct*f=(MyStruct*)MyStruct;myvariable=f->myNewClassName;
Xlib.h
解决此问题(和XColormapEvent.new
的类似问题)有一些宏损坏。您自己的结构、第三方结构或XLib结构有问题吗?它是XLib结构(“可视”).你是对的,事实证明xlib有一个马可来解决这个问题。这就是我现在使用的。但这个问题可能也会引起其他C库的普遍兴趣。@forsvarir:肮脏但合法。请参阅广泛的讨论。我想他已经知道了。他在问是否有办法解决这个问题。但最肯定的是,没有。我知道我知道假设我不能重命名Struts成员。无论如何,没有办法访问它吗?(比如暂时禁用某个C++关键字?)-1,海报已经知道这一点,他正在寻找解决办法。正确阅读问题。+1:这是解决这个问题最直接、最受广泛支持的方法。@wallyk,前提是如果“header.h”只是一个C
头文件。@iammilind,如果它包含一个名为“class”的成员的结构,则可以对其进行分析这是我使用的解决方案。直接和简单。技术上是ODR违规,但是,不像福斯瓦尔的解决方案(在评论)中,这个答案看起来像C++标准兼容(不需要使用扩展)。你真的尝试过吗?我相信代码>外部C”。<代码> >更改调用约定和/或修改,但该块中的代码仍然需要有效的C++。我不理解。<代码>外部“C”<代码>不编译为C,而 MyStRES>类< /COD>不编译为C++,那么这个代码段在哪里?编辑:AH,VJo打破了它。应该发生的是C文件应该包含<代码> MyValue= MyStReult>类;<>代码> StuttSevabyLe.GETClass(StuttSoopSt**p){Read and &(P>类)},C++程序应该包含<代码>外“C”{ SevabyMyFuffels:SevabyL*GETClass。(somestruct*;}
]@Steve Jessop,这里的意图是在.c
文件中保留类
变量相关代码,并使用外部“c”保持其接口对c++
可见
。所以,我不建议在.cpp
文件中使用class
。@iammilind:是的,我现在知道它是VJo的代码,而不是你的。你想编辑你建议的答案吗,还是我应该像VJo那样做,g