2012-02-25 134 views
2

Horde3d声称可用的C'样式'接口。但我无法包含头文件编译C源,因为这些错误的:结构中的枚举声明

..../../horde3d/SDK_1.0.0_Beta5/Horde3D/Bindings/C++/Horde3D.h:127: error: nested redefinition of ‘enum List’ 

由于这些声明:

.... 

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

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

....

正在Horde3d真正发展在C++中,标识符List可以通过封闭结构来限定。这在C中似乎不可用。除了重写头之外,是否存在一些解决方法?

+0

他们声称有“C绑定”,或只是一个“C风格的接口”? – 2012-02-25 12:37:04

+1

重写头,不包括有问题的头或使用C++编译器似乎是你唯一的选择 – Flexo 2012-02-25 12:37:50

+1

@awoodland:我同意,考虑到头也*使用*这些定义 - 和'::'是无效的C ... – Christoph 2012-02-25 12:51:15

回答

2

在C中,在单个翻译单元中,所有enum标签名称都位于同一名称空间中,因此不能重复使用它们两次。如果您希望两者共存,则必须更改第二个enum标记。

3

这是故意完成的。 C++标准的附录C说明:

变化:一个结构是C++中的范围,不是在C
理由:类范围是C++的关键,和一个结构是一类。
对原始特征的影响:更改为明确定义的特征的语义。
难度转换:语义转换。
使用范围广泛: C程序非常频繁地使用struct,但只有在struct,枚举或枚举器名称被引用到struct之外时,才会引起更改。后者可能很少见。

显然,委员会只审议了C如何有效的代码将工作作为C++,如果使用新的功能,不C++代码将仍然有效C.

+0

我不明白,这是如何回答这个问题的,以及这可以如何帮助解决他的问题。 – 2012-02-25 12:48:15

+0

它解释了为什么它不起作用 - “C接口”使用C++作用域规则,因此它不能编译为C.在C++中,枚举对于每个结构都是本地的,对于C而言,它们不是。 – 2012-02-25 12:52:21

+0

@波佩尔森:因为我发现自己是一个解决方案,我必须取消选择您以前接受的答案,以便能够接受我的答案。希望这不会伤害... – CapelliC 2012-02-26 18:39:46

1

我(几乎)发现我一直在寻找的解决方案:其放置前的包括一组宏允许在C.接口Horde3D

#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 

编辑

正如克里斯托弗指出的那样,它是使用禁止完全解决方案的非C令牌的。由于H3DOptions :: List和H3DStats :: List的使用,上述这些宏只剩下3个错误。然后我编辑了Horde3D.h,并添加了

#define H3DStats__List int 
#define H3DOptions__List int 

到上面的宏。用C++编译现在需要

#define H3DStats__List H3DStats::List 
#define H3DOptions__List H3DOptions::List