2009-07-28 7 views
5

मेरी समस्या यह है कि मेरे पास दो अलग-अलग फाइलों में दो enums हैं जिनमें स्थिरांक के समान सेट होना चाहिए (दो अलग-अलग प्रक्रियाओं को दो फाइलों द्वारा उत्पन्न किया जाता है अन्य फाइलों के साथ)। मैं चाहता हूं कि enums को सिंक में होना चाहिए यानी जब कोई व्यक्ति enum x के लिए एक नया मान जोड़ता है और अन्य enum को अपडेट करना भूल जाता है, तो मैं संकलन त्रुटि फेंकना चाहता हूं। क्या यह संभव है?सी प्रोग्राम - यह जांचना कि संकलन समय पर दो enums सिंक हो रहे हैं

उत्तर

11

आप इस घोषणा को एक ही शीर्षलेख फ़ाइल में क्यों नहीं डाल रहे हैं और फिर इसे दो स्थानों में शामिल कर रहे हैं?

+0

मैं जानना चाहता हूं कि संकलन समय पर ऐसी चीज की जा सकती है या नहीं। –

+0

जहां तक ​​मुझे पता है कि संकलन समय पर यह संभव नहीं है। आप प्री-प्रीप्रोसेसर लिखने और जीसीसी (या जो भी आप उपयोग करते हैं) को कॉल करने से पहले इसे चला सकते हैं। यह प्री-प्रीप्रोसेसर दोनों फाइलें या उनमें से एक को दूसरी तरफ उत्पन्न करेगा। – Gregor

+0

@ ग्रेगोर, हमम। अच्छी कॉल, आप संकलन शुरू करने से पहले एक अलग चरण के रूप में प्रासंगिक घोषणा की कई प्रतियां उत्पन्न कर सकते हैं। –

5

प्रत्येक enums एक ज्ञात enum, जैसे LAST_ENUM_1 और LAST_ENUM_2 के साथ समाप्त होता है। एक फ़ाइल में #if का उपयोग करें जिसमें तुलना करने के लिए दोनों हेडर फ़ाइलों तक पहुंच है।

#if LAST_ENUM_1 != LAST_ENUM_2 
    #error Enums have different sizes 
#endif 
+0

+1 अच्छा विचार। पता नहीं था कि '# error' जैसी कुछ है। – Gregor

+0

मुझे लगता है कि # आतंक मानक का हिस्सा है। आम तौर पर # चेतावनी भी होती है (या समान) लेकिन यह सी मानक का हिस्सा नहीं है। – Robert

+0

क्या प्रीप्रोसेसर के लिए भी enum स्थिरांक के मूल्य उपलब्ध हैं? मुझे लगता है कि वे नहीं हैं, इसलिए अंतिम चेक रनटाइम में किया जाना चाहिए ... – Tobi

0

enums में उपयोग होने वाले नाम स्पष्ट होने की जरूरत है, तो आप एक समस्या है: या तो संकलक दोनों परिभाषाओं की पहुंच है, तो enums नहीं समान नाम समस्या या संकलक की वजह से हो सकता है एक समय में केवल एक परिभाषा तक पहुंच है, उसके पास इसके खिलाफ जांच करने के लिए कुछ भी नहीं है।

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

0

की तरह उपयोग

enum EMyEnum 
{ 
    JOE = 0, 
    BLACK = 1, 
    WHITE = 2, 

    END_OF_ENUM = 3 
} 

अगर आपको लगता है कि प्रारूप की तरह इस्तेमाल करते हैं, हो सकता है आप संभाल कर सकते हैं सब कुछ आसान

+1

मैं अंत में '= 3' नहीं डालूंगा क्योंकि जब आप एक enum जोड़ते हैं तो आपको बदलने के लिए याद रखना एक और चीज है। – Robert

1

मैं वास्तव में एक मैं अब sugest होगा की तुलना में बेहतर अन्य उत्तर की तरह ...

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

0

चूंकि कंपाइलर एक समय में एक स्रोत फ़ाइल (अनुवाद इकाई, टीयू) को देखता है, इसलिए वर्तमान टीयू और कुछ अन्य टीयू के बीच मेल नहीं खा रहा है, जो कि यह नहीं देख रहा है।

आपको चीजों को ठीक करने की आवश्यकता है ताकि आपके पास दोनों प्रोग्रामों द्वारा उपयोग की जाने वाली enum की परिभाषा की एक प्रति हो - इसलिए यह दोनों शीर्षकों में शामिल हैडर में है। बहुत कुछ और भी आराम के लिए प्रवण त्रुटि है।

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