首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构中的枚举声明

结构中的枚举声明
EN

Stack Overflow用户
提问于 2012-02-25 20:35:33
回答 3查看 554关注 0票数 2

Horde3d声称有一个C 'style‘接口可用。但由于以下错误,我无法包含编译C源代码的头文件:

代码语言:javascript
复制
..../../horde3d/SDK_1.0.0_Beta5/Horde3D/Bindings/C++/Horde3D.h:127: error: nested redefinition of ‘enum List’

由于这些声明:

代码语言:javascript
复制
....

struct H3DOptions
{
    /* ... */
    enum List
    {
        MaxLogLevel = 1,
        MaxNumMessages,
        TrilinearFiltering,
        ....
    };
...
};

struct H3DStats
{
    /* ... */
    enum List
    {
        TriCount = 100,
        BatchCount,
        LightPassCount,
        ...
    };
};

……

作为真正用C++开发的Horde3d,标识符列表通过封装结构来进行限定。这似乎在C中不可用。除了重写头文件之外,是否存在一些解决方法?

EN

回答 3

Stack Overflow用户

发布于 2012-02-25 20:43:52

这是故意的。C++标准的附录C解释了:

Change:结构是C++中的作用域,而不是C中的作用域

原理:类作用域对C++至关重要,而结构就是一个类。

对原始特征的影响:改变为定义明确的特征的语义。

转换的难点:语义转换。

如何广泛使用:C程序非常频繁地使用结构,但只有在结构、枚举或枚举器名称在结构之外引用时,这种变化才会引起注意。后者可能很少见。

显然,委员会只考虑了C代码作为C++的有效性,而不是考虑使用新功能的C++代码是否仍然是有效的C。

票数 3
EN

Stack Overflow用户

发布于 2012-02-25 20:37:47

在C语言中,在一个翻译单元中,所有enum标记名都位于相同的名称空间中,您不能重复使用它们。如果你想让它们共存,你必须改变你的第二个enum标签。

票数 2
EN

Stack Overflow用户

发布于 2012-02-27 02:41:50

我(几乎)找到了我正在寻找的解决方案:放在include之前的一组宏允许用C语言连接Horde3D。

代码语言:javascript
复制
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glext.h>
#include <GL/freeglut.h>

#define TOKPASTE1(x, y) x ## y
#define TOKPASTE2(x, y) TOKPASTE1(x, y)

/* List is shared between many structs
 */
#define List TOKPASTE2(List_, __LINE__)

/* these symbols are duplicated: their functionality is compromised
 */
#define Code TOKPASTE2(Code_, __LINE__)
#define SamplerElem TOKPASTE2(SamplerElem_, __LINE__)
#define UniformElem TOKPASTE2(UniformElem_, __LINE__)
#define SampNameStr TOKPASTE2(SampNameStr_, __LINE__)
#define UnifNameStr TOKPASTE2(UnifNameStr_, __LINE__)
#define Undefined   TOKPASTE2(Undefined_,   __LINE__)
#define MatResI     TOKPASTE2(MatResI_,     __LINE__)

#include <Horde3D.h>
#include <Horde3DUtils.h>

/* disambiguate C client code:
   let the compiler signal eventual usage of compromised symbols
 */
#undef List
#undef Code
#undef SamplerElem
#undef UniformElem
#undef SampNameStr
#undef UnifNameStr
#undef Undefined
#undef MatResI

编辑

正如Christoph所指出的,非C令牌的使用阻碍了完整的解决方案。由于H3DOptions::List和H3DStats::List的使用,上面的这些宏只留下了3个错误。然后我编辑了Horde3D.h,并添加了

代码语言:javascript
复制
#define H3DStats__List int
#define H3DOptions__List int

添加到上面的宏。使用now在C++中编译将需要

代码语言:javascript
复制
#define H3DStats__List H3DStats::List
#define H3DOptions__List H3DOptions::List
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9444022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档