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中不可用。除了重写标题之外,是否存在一些解决方法?
答案 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