2010-01-18 4 views
6

पुराने सी/सी ++ कोड को साफ करना जो enums के बजाय हार्डकोडेड पूर्णांक अक्षर का उपयोग करता है, यह उन स्थानों को खोजने के लिए कठिन है जहां फ़ंक्शन-घोषणा ठीक से प्रतिक्रिया की गई है लेकिन शरीर नहीं। जैसेक्या कोई सी/सी ++ कंपाइलर है जो int (या त्रुटि दे सकता है) या int को enum रूपांतरण कर सकता है?

enum important { 
    little = 1, 
    abit = 2, 
    much = 3 
}; 

void blah(int e) 
{ 
    // magic stuff here 
} 

void boing(int e) { ... } 

void guck(important e) 
{ 
    switch (e) { 
    case 3: // this would be a good place for a warning 
     blah(e); // and this 
     break; 
    default: 
     boing((int)e); // but this is OK (although imperfect and a warning would be acceptable) 
     break; 
    } 
} 

टिप्पणी करना/प्रत्येक enum प्रकार को संशोधित करने या कोड के माध्यम से खोज के रूप में वहाँ बहुत बहुत सारे अलग अलग enums हैं, तो यह प्राथमिकता नहीं दी जाती है, लेकिन एक स्वीकार्य समाधान हो सकता है उन्हें भी काम भी पर्याप्त मात्रा में होगा।

मुझे इसे किसी भी मुख्य कंपाइलर या अन्य टूल्स (जीसीसी ज्यादातर) या प्लेटफ़ॉर्म (अधिकांश) में होने की आवश्यकता नहीं है, इसे मैन्युअल रूप से चलाने के लिए दो बार पर्याप्त होगा, लेकिन मैं ऐसा कुछ पसंद करूंगा जो नहीं है बहुत गूढ़ या सस्ता।

+0

क्या जीसीसी इस पूरी तरह से संभाल नहीं करता है? मैं g ++ का उपयोग कर रहा हूं और हमेशा वर्णित चेतावनियां देखता हूं। शुद्ध सी संकलक अलग व्यवहार करता है? – Basilevs

+0

नहीं, इस कोड को संकलित करना (शून्य ... और प्लस एक खाली मुख्य()) के साथ: g ++ -Wall test.cpp 0 चेतावनियां देता है। Int से enum के लिए प्रचार चेतावनी दी जाती है, लेकिन दूसरी तरफ नहीं। यदि आपके पास काम करने का दूसरा तरीका है, तो कृपया मुझे अपनी कमांड लाइन दें। कृपया ... –

उत्तर

1

फाहा आप के लिए यह चेतावनी प्रदान करेंगे (हालत 641)

641 परिवर्तित enum int करने के लिए - एक गणना प्रकार इस तरह के एक अंकगणितीय ऑपरेटर या करने के लिए एक तर्क के रूप में एक संदर्भ है कि एक गणना के लिए आवश्यक में इस्तेमाल किया गया था एक अभिन्न तर्क की तुलना में था। यदि आप गणना के पूर्णांक मॉडल (+ fie) का उपयोग करते हैं तो यह चेतावनी दबा दी जाएगी, लेकिन आप ऐसा करने में कुछ मूल्यवान टाइप-चेकिंग खो देंगे। एक इंटरमीडिएट पॉलिसी केवल चेतावनी को बंद करना है। इंट एन इंट का असाइनमेंट अभी भी पकड़ा जाएगा।

पट्टी (http://www.splint.org/download.html) एक आधुनिक फाहा आप इस से कुछ के साथ मदद कर सकता है

+0

हां, छोटे सी भाग के लिए, दुर्भाग्य से हमारे पास सी ++ स्टाइल टिप्पणियां हैं, इसलिए तुरंत स्प्लिंट पुक्स, मुझे लगता है कि मैं उन लोगों को दूर कर सकता हूं। आप किसी भी ठीक सी ++ सक्षम या लिंट को अनदेखा पट्टे पर जानते हैं? –

1

Sparse (एक अर्थ चेकर लिनक्स कर्नेल लोगों द्वारा इस्तेमाल उपकरण) का उपयोग कर सकते है।

इन विकल्पों द्वारा enum त्रुटियों का एक सबसेट पकड़ा जा सकता है: -वेनम-मेलमिच, -वैक-ट्रंकेट। हालांकि, मैंने इस के माध्यम से अपना कोड चलाया और ऐसा लगता है कि उनमें से किसी को भी पकड़ा नहीं गया था।

यह मुफ्त सॉफ्टवेयर है, क्या आप इसे विस्तारित करना चाहते हैं।

संबंधित मुद्दे