2012-11-27 33 views
0

下面的代碼編譯罰款在Windows上使用Visual Studio:由於typeid()。raw_name()會導致C++代碼無法編譯GCC - 我該如何解決這個問題?

class_handle(base *ptr) : ptr_m(ptr), name_m(typeid(base).raw_name()) { signature_m = CLASS_HANDLE_SIGNATURE; } 

如果我嘗試編譯Linux上的相同的代碼我得到:

error: ‘const class std::type_info’ has no member named ‘raw_name’ 

,據我瞭解,raw_name是微軟specific執行。我該如何更改我的代碼才能編譯Windows和Linux系統?

EDIT1我寧願不修改原始代碼,我只是需要一個解決方法來使用gcc進行編譯。那可能嗎?

EDIT2#define raw_name name做詭計嗎?你知道在微軟的編譯器來定義令牌使用#ifdef

// for variables: 
template<typename T> 
char const* GetRawName(T unused) { ... } 
// for types: 
template<typename T> 
char const* GetRawName() { ... } 

與Windows和不上的Windows不同的實現,但不是在你的其他編譯器:

+3

切換到'name()'好嗎? –

+0

@ R.MartinhoFernandes我寧願不修改原始代碼。任何解決方法? – memyself

+6

@memyself沒有乾淨的,符合標準的解決方法。 (你可以重新定義''raw_name'',但是這樣會將你發送到一個特殊的地獄)。此外,沒有必要永遠使用'raw_name',所以我完全禁止它從代碼庫。 –

回答

0

寫這些。這將MS和非MS編譯版本之間的預處理差異隔離爲一個獨立的文件。

這確實需要對原始代碼進行最小程度的更改,但是仍然以仍然可以在Microsoft編譯器上編譯的方式進行。

0

這可能是比較安全的#define typeid

class compat_typeinfo { 
    const std::type_info &ti; 
public: 
    explicit compat_typeinfo(const std::type_info &ti): ti(ti) {} 
    const char *name() const { return ti.name(); } 
    const char *raw_name() const { return ti.name(); } 
}; 
compat_typeinfo compat_typeid(const std::type_info &ti) { 
    return compat_typeinfo(ti); 
} 
#define typeid(x) compat_typeid(typeid(x)) 

當然,這是17.6.4.3.1p2(翻譯單元非法不得#define#undef名詞法相同的關鍵字[...] ),但它很可能會工作,並且需要在其他地方進行最小限度的修改。

+0

也許更安全。但無效(您不允許重新定義關鍵字)。 –

相關問題