Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的命名冲突+;:如何访问名为“的结构成员”;“类”;_C++_C_Struct_Naming Conventions - Fatal编程技术网

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++中的关键字。不能将其用作变量 如果您

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

我使用的结构有一个名为“class”的成员。我假设这个库主要用于普通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