2012-04-28 11 views
6

Supponiamo che ci sia un C++ 11 API che utilizza le classi enum:collegamento di enumerazioni e enum classi

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

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

Ora supponiamo che io vorrei usare questa API, ma non ho un C + +11 compilatore. Quindi:

  • Modificare api.hpp e modificare la classe enum per essere solo un normale enum.
  • Scrivere un codice codice che include lo modificato e utilizza normalmente l'API (ad esempio chiamate f).
  • Compilare questo codice con il mio compilatore non C++ 11 e collegarlo all'implementazione API che è stata compilata con un compilatore C++ 11 (utilizzando lo 10 non modificato).

Questo sembra funzionare con GCC, ma è sicuro in generale, o sto giocando con il fuoco (violazioni ODR e così via)?

Supponiamo che i due compilatori siano altrimenti compatibili con il collegamento, è solo la classe enum vs. enum in questione.

risposta

5

Come dice ildjarn, si tratta di un comportamento non definito. E la ragione per cui questo in realtà può fallire con le implementazioni reali è che le normali enumerazioni di C++ 03 non hanno un tipo sottostante fisso. Mentre il tuo tipo di classe enum ha sempre "int" come tipo sottostante, un enumerato C++ 03 potrebbe avere "short" come tipo sottostante, rendendo il codice non compatibile con il layout.