मेरे पास यह मैक्रो कोड है, जो मुझे सी enum और एक निर्माण का उपयोग करके तारों के रूप में गणना किए गए नामों की एक सूची को परिभाषित करने की अनुमति देता है। यह मुझे गणक नामों को डुप्लिकेट करने से रोकता है (और संभवतः बड़ी सूचियों के लिए त्रुटियों को पेश करता है)।गिनती प्रीप्रोसेसर मैक्रोज़
#define ENUM_DEFINITIONS(F) \
F(0, Item1) \
F(5, Item2) \
F(15, Item3) \
...
F(63, ItemN)
तो:
enum Items {
#define ITEM_ENUM_DEFINE(id, name) name = id,
ENUM_DEFINITIONS(ITEM_ENUM_DEFINE)
#undef ITEM_ENUM_DEFINE
, जो जब विस्तार हुआ, चाहिए उत्पादन:
enum Items {
Item1 = 0,
Item2 = 5,
Item3 = 15,
...
ItemN = 63,
}
कार्यान्वयन फ़ाइल में, मैं इस कोड है:
const char* itemNames[TOTAL_ITEMS];
int iter = 0;
#define ITEM_STRING_DEFINE(id, name) itemNames[iter++] = #name;
ENUM_DEFINITIONS(ITEM_STRING_DEFINE)
#undef ITEM_STRING_DEFINE
जो, विस्तारित होने पर, उत्पादन:
itemNames[iter++] = "Item1";
itemNames[iter++] = "Item2";
itemNames[iter++] = "Item3";
...
itemNames[iter++] = "ItemN";
मैं जानना चाहता हूं कि मैंने इस फैशन में कितने गणक आइटम बनाए हैं और इसे संकलन-समय सरणी में पास करने में सक्षम हैं। उपर्युक्त उदाहरण में, यह संकलन-समय पर TOTAL_ITEMS = N निर्धारित करेगा। क्या इस तरह मैक्रो इनोकेशन को गिनना संभव है?
मैं एक गैर मानक काउंटर मैक्रो, फ़ाइल और लाइन मैक्रो के लिए इसी तरह का उल्लेख देखा है, लेकिन मैं आशा करती हूं वहाँ एक और अधिक मानक तरीका है।
मैक्रोज़ का उपयोग किए बिना इसे प्राप्त करने का एक बेहतर तरीका सुनने में रुचि रखने में भी रुचि होगी।
आपको 'enum' और तारों की सरणी दोनों की आवश्यकता क्यों है? – Philip
ऐसा लगता है कि यह मेरी काम की रेखा में काफी बार आता है। एक उदाहरण एक राज्य मशीन होगी जहां राज्यों की गणना की जाती है, और फ्रंट-एंड जीयूआई वर्तमान स्थिति का नाम प्रदर्शित करता है। इसे केवल एक बार परिभाषित करना सुविधाजनक है, और यह उन अन्य डेवलपर्स के लिए आसान बनाता है जो नए राज्य जोड़ना चाहते हैं। – Eyal