结构中的枚举声明

时间:2012-02-25 12:35:33

标签: c++ c

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通过封闭struct来限定。这似乎在C中不可用。除了重写标题之外,是否存在一些解决方法?

3 个答案:

答案 0 :(得分:3)

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

  

更改:结构是C ++中的范围,而不是C中   基本原理:类范围对于C ++至关重要,而结构是一个类   对原始功能的影响:更改定义明确的功能的语义   转换难度:语义转换   使用的广泛程度: C程序非常频繁地使用struct,但只有在struct,enumeration或枚举器名称引用到struct之外时才会发现更改。后者可能很少见。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我(几乎)找到了我正在寻找的解决方案:在include之前放置的一组宏允许在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