2012-04-28 70 views
6

假設存在使用枚舉類C++的11 API:鏈路兼容性和枚舉類

// api.hpp 
enum class E {A, B, C}; 
void f(E); 
... 

// api.cpp 
void f(E e) 
{ 
    if (e == E::A) 
     ... 
} 

現在假設我想使用這個API,但我沒有一個C + +11編譯器。所以我:

  • 修改api.hpp並將enum類更改爲常規枚舉。
  • 編寫一些包含修改後的api.hpp的代碼並正常使用該API(例如,調用f)。
  • 將此代碼與我的非C++ 11編譯器編譯並將其鏈接到使用C++ 11編譯器編譯的API實現(使用未修改的api.hpp)。

這似乎與海灣合作委員會,但它是安全的一般,還是我玩火(ODR違規等)?

假設兩個編譯器是鏈接兼容的,它只是enum和enum類的問題。

回答

5

像ildjarn所說的,這是未定義的行爲。而實際上實際上可能會失敗的原因是,普通的C++ 03枚舉沒有固定的基礎類型。雖然枚舉類型始終爲具有「int」作爲其基礎類型,但相應的C++ 03枚舉可能具有「short」作爲其基礎類型,從而使代碼不兼容佈局。