Horde3d声称有一个C 'style‘接口可用。但由于以下错误,我无法包含编译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,
...
};
};……
作为真正用C++开发的Horde3d,标识符列表通过封装结构来进行限定。这似乎在C中不可用。除了重写头文件之外,是否存在一些解决方法?
发布于 2012-02-25 20:43:52
这是故意的。C++标准的附录C解释了:
Change:结构是C++中的作用域,而不是C中的作用域
原理:类作用域对C++至关重要,而结构就是一个类。
对原始特征的影响:改变为定义明确的特征的语义。
转换的难点:语义转换。
如何广泛使用:C程序非常频繁地使用结构,但只有在结构、枚举或枚举器名称在结构之外引用时,这种变化才会引起注意。后者可能很少见。
显然,委员会只考虑了C代码作为C++的有效性,而不是考虑使用新功能的C++代码是否仍然是有效的C。
发布于 2012-02-25 20:37:47
在C语言中,在一个翻译单元中,所有enum标记名都位于相同的名称空间中,您不能重复使用它们。如果你想让它们共存,你必须改变你的第二个enum标签。
发布于 2012-02-27 02:41:50
我(几乎)找到了我正在寻找的解决方案:放在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编辑
正如Christoph所指出的,非C令牌的使用阻碍了完整的解决方案。由于H3DOptions::List和H3DStats::List的使用,上面的这些宏只留下了3个错误。然后我编辑了Horde3D.h,并添加了
#define H3DStats__List int
#define H3DOptions__List int添加到上面的宏。使用now在C++中编译将需要
#define H3DStats__List H3DStats::List
#define H3DOptions__List H3DOptions::Listhttps://stackoverflow.com/questions/9444022
复制相似问题