मेरी समस्या यह है कि मेरे पास दो अलग-अलग फाइलों में दो enums हैं जिनमें स्थिरांक के समान सेट होना चाहिए (दो अलग-अलग प्रक्रियाओं को दो फाइलों द्वारा उत्पन्न किया जाता है अन्य फाइलों के साथ)। मैं चाहता हूं कि enums को सिंक में होना चाहिए यानी जब कोई व्यक्ति enum x के लिए एक नया मान जोड़ता है और अन्य enum को अपडेट करना भूल जाता है, तो मैं संकलन त्रुटि फेंकना चाहता हूं। क्या यह संभव है?सी प्रोग्राम - यह जांचना कि संकलन समय पर दो enums सिंक हो रहे हैं
उत्तर
आप इस घोषणा को एक ही शीर्षलेख फ़ाइल में क्यों नहीं डाल रहे हैं और फिर इसे दो स्थानों में शामिल कर रहे हैं?
प्रत्येक enums एक ज्ञात enum, जैसे LAST_ENUM_1 और LAST_ENUM_2 के साथ समाप्त होता है। एक फ़ाइल में #if का उपयोग करें जिसमें तुलना करने के लिए दोनों हेडर फ़ाइलों तक पहुंच है।
#if LAST_ENUM_1 != LAST_ENUM_2
#error Enums have different sizes
#endif
+1 अच्छा विचार। पता नहीं था कि '# error' जैसी कुछ है। – Gregor
मुझे लगता है कि # आतंक मानक का हिस्सा है। आम तौर पर # चेतावनी भी होती है (या समान) लेकिन यह सी मानक का हिस्सा नहीं है। – Robert
क्या प्रीप्रोसेसर के लिए भी enum स्थिरांक के मूल्य उपलब्ध हैं? मुझे लगता है कि वे नहीं हैं, इसलिए अंतिम चेक रनटाइम में किया जाना चाहिए ... – Tobi
enums में उपयोग होने वाले नाम स्पष्ट होने की जरूरत है, तो आप एक समस्या है: या तो संकलक दोनों परिभाषाओं की पहुंच है, तो enums नहीं समान नाम समस्या या संकलक की वजह से हो सकता है एक समय में केवल एक परिभाषा तक पहुंच है, उसके पास इसके खिलाफ जांच करने के लिए कुछ भी नहीं है।
यहां तक कि तत्वों की संख्या (रॉबर्ट द्वारा प्रस्तावित) की गणना संकलन समय पर नहीं की जा सकती है (प्रीप्रोसेसर को enums के बारे में कुछ भी पता नहीं है)। यदि आपके पास वास्तव में एक सामान्य शीर्षलेख फ़ाइल नहीं हो सकती है, तो आपके आवेदन की शुरुआत में सबसे आसान काम रनटाइम चेक होगा।
की तरह उपयोग
enum EMyEnum
{
JOE = 0,
BLACK = 1,
WHITE = 2,
END_OF_ENUM = 3
}
अगर आपको लगता है कि प्रारूप की तरह इस्तेमाल करते हैं, हो सकता है आप संभाल कर सकते हैं सब कुछ आसान
मैं अंत में '= 3' नहीं डालूंगा क्योंकि जब आप एक enum जोड़ते हैं तो आपको बदलने के लिए याद रखना एक और चीज है। – Robert
मैं वास्तव में एक मैं अब sugest होगा की तुलना में बेहतर अन्य उत्तर की तरह ...
यदि अन्य सभी समाधान आपके लिए काम नहीं करते हैं, तो एक साधारण पर्ल स्क्रिप्ट लिखें जो जांचता है कि वे समान हैं और सुनिश्चित करें कि पर्ल स्क्रिप्ट को आपके मेकफ़ाइल से कॉल किया गया है। यह आपकी समस्या का समाधान करेगा, लेकिन यदि आप कर सकते हैं तो इससे बचने का प्रयास करें।
चूंकि कंपाइलर एक समय में एक स्रोत फ़ाइल (अनुवाद इकाई, टीयू) को देखता है, इसलिए वर्तमान टीयू और कुछ अन्य टीयू के बीच मेल नहीं खा रहा है, जो कि यह नहीं देख रहा है।
आपको चीजों को ठीक करने की आवश्यकता है ताकि आपके पास दोनों प्रोग्रामों द्वारा उपयोग की जाने वाली enum की परिभाषा की एक प्रति हो - इसलिए यह दोनों शीर्षकों में शामिल हैडर में है। बहुत कुछ और भी आराम के लिए प्रवण त्रुटि है।
- 1. जांचना कि दो वस्तुओं के बराबर हैं,
- 2. जांचना कि argv [मैं] सी ++
- 3. यह जांचना कि फ़ाइल वास्तव में ईपीप्लस
- 4. जांचना कि क्या दो विशाल पायथन शब्दकोश समतुल्य हैं
- 5. यह जांचना कि क्या बफर को आर
- 6. स्कोन - संकलन के बाद चल रहे प्रोग्राम
- 7. यह जांचना कि क्या कंसोल अनुप्रयोग C#
- 8. यह जांचना कि कोई फ़ाइल .NET असेंबली
- 9. यह जांचना कि क्या एक स्ट्रिंग XXXX
- 10. सी # enums टाइपएफ़ हैं?
- 11. यह जांचना कि दिनांक सप्ताहांत है PHP
- 12. यह जांचना कि क्या एक एनएसडीएटी
- 13. सी ++ में संकलन-समय सम्मिलन?
- 14. साझा लाइब्रेरी के दो उदाहरण लोड हो रहे हैं
- 15. जांचें कि iso_c_binding संकलन-समय
- 16. क्या यह जांचना संभव है कि दो sha2 हैश एक ही सादे पाठ से आए हैं?
- 17. यह जांचना कि क्या एक स्ट्रिंग वेक्टर
- 18. यह जांचना कि क्या सत्यापन कोड
- 19. सी ++ संकलन समय चाल
- 20. जावा में संकलन समय पर कुछ कैसे जोर देना है?
- 21. सी # Enums
- 22. सी ++ संकलन समय फ़ंक्शन निष्पादन
- 23. सी ++ प्रोग्राम के संकलन के चरण क्या हैं?
- 24. निजी कक्षाओं को संकलन पर सील कर रहे हैं?
- 25. सी ++ संकलन-समय निरंतर पहचान
- 26. यह जांचना कि क्या उपयोगकर्ता पहले से ही ड्रूपल
- 27. संकलन समय
- 28. व्यूपेगर टुकड़े समय के साथ नष्ट हो रहे हैं?
- 29. बिट स्ट्रिंग्स: यह जांचना कि क्या एक बिटस्ट्रिंग किसी अन्य
- 30. जांचना कि JSON
मैं जानना चाहता हूं कि संकलन समय पर ऐसी चीज की जा सकती है या नहीं। –
जहां तक मुझे पता है कि संकलन समय पर यह संभव नहीं है। आप प्री-प्रीप्रोसेसर लिखने और जीसीसी (या जो भी आप उपयोग करते हैं) को कॉल करने से पहले इसे चला सकते हैं। यह प्री-प्रीप्रोसेसर दोनों फाइलें या उनमें से एक को दूसरी तरफ उत्पन्न करेगा। – Gregor
@ ग्रेगोर, हमम। अच्छी कॉल, आप संकलन शुरू करने से पहले एक अलग चरण के रूप में प्रासंगिक घोषणा की कई प्रतियां उत्पन्न कर सकते हैं। –