2012-04-28 19 views
6

मान लीजिए enum कक्षाओं का उपयोग करता है एक सी ++ 11 एपीआई है:लिंक संगतता और enum कक्षाएं

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

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

अब मैं इस एपीआई का उपयोग करना चाहते हैं लगता है, लेकिन मैं एक सी + की जरूरत नहीं है +11 संकलक। तो मैं:

  • api.hpp संशोधित करें और enum क्लास को केवल एक नियमित enum के रूप में बदलें।
  • कुछ कोड कोड लिखें जिसमें संशोधित api.hpp शामिल है और सामान्य रूप से API का उपयोग करता है (उदा। f पर कॉल करें)।
  • इस कोड को मेरे गैर-सी ++ 11 कंपाइलर के साथ संकलित करें और इसे एपीआई कार्यान्वयन से लिंक करें जिसे सी ++ 11 कंपाइलर के साथ संकलित किया गया था (अनमोडिफाइड api.hpp का उपयोग करके)।

ऐसा लगता है कि यह जीसीसी के साथ काम करता है, लेकिन क्या यह सामान्य रूप से सुरक्षित है, या क्या मैं आग (ओडीआर उल्लंघन और ऐसे) के साथ खेल रहा हूं?

मान लें कि दो कंपाइलर्स अन्यथा लिंक-संगत हैं, यह केवल एनम बनाम एनम क्लास है जो मुद्दा पर है।

उत्तर

5

जैसे कि ildjarn कह रहा है, यह अपरिभाषित व्यवहार है। और वास्तविक कार्यान्वयन पर असल में यह असफल हो सकता है कि सामान्य सी ++ 03 एनम्स में निश्चित अंतर्निहित प्रकार नहीं है। जबकि आपके एनम-क्लास प्रकार हमेशा में इसके अंतर्निहित प्रकार के रूप में "int" है, एक संबंधित सी ++ 03 एनम के अंतर्निहित प्रकार के रूप में "छोटा" हो सकता है, जिससे कोड को लेआउट संगत नहीं बनाया जा सकता है।

1

आप One Definition Rule (§3.2/5) का उल्लंघन करेंगे। परिणाम: अपरिभाषित व्यवहार।