2012-02-25 93 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