2012-06-30 15 views
5

मुझे कुछ पूर्णांक आईडी के साथ विभिन्न फाइलों में कुछ स्थिरांक लिखना है।संकलन समय में पूर्णांक मान

#define MESSAGE_FIRST 0 

अन्य फ़ाइल में: उदाहरण के लिए:

#define MESSAGE_ANOTHER 1 

किसी भी तरीके संकलन समय में स्वचालित रूप से उस आईडी प्राप्त करने के लिए? कुछ ऐसा:

#define MESSAGE_AUTO GetNextId() 

मैं यहां enums का उपयोग नहीं कर सकता क्योंकि यह निर्देश विभिन्न फाइलों में होंगे।

धन्यवाद।

पेज। जीसीसी, लिनक्स

+0

मानक में \ _ \ _ COUNTER \ _ \ _ (\ _ \ _ LINE \ _ \ _ के समान) AFAIK जैसा कुछ नहीं है। अनुलेख मेरे अपने प्रीप्रोसेसर में मेरे पास यह है। –

+0

मैं बाहरी कोड पीढ़ी के बाहर ऐसा करने के किसी भी तरीके से नहीं सोच सकता। लेकिन हो सकता है कि अगर आप उस वास्तविक समस्या का अधिक विस्तृत विवरण देते हैं जिसे आप हल करने की कोशिश कर रहे हैं, तो हम आपको एक बेहतर समाधान दे सकते हैं। –

+1

क्या उन्हें अलग-अलग फाइलों में होना है? या क्या वे सभी इन मानों के साथ एक ही हेडर फ़ाइल शामिल कर सकते हैं? – Matt

उत्तर

5

आप एक संकलन समय काउंटर कर सकते हैं ओवरलोडिंग:

template<unsigned int n> struct Count { bool data[n]; }; 
template<int n> struct Counter : public Counter<n-1> {}; 
template<> struct Counter<0> {}; 
Count<1> GetCount(Counter<1>); 

#define MAX_COUNTER_NUM 64 
#define COUNTER_VALUE (sizeof(GetCount(Counter<MAX_COUNTER_NUM + 1>()))/sizeof(bool)) 
#define INC_COUNTER Count<COUNTER_VALUE + 1> GetCount(Counter<COUNTER_VALUE + 1>); 

आप कार्रवाई here में देख सकते हैं। एमएसवीसी के साथ भी काम करता है।

1

आप कहते हैं कि आप जीसीसी का उपयोग कर रहे हैं। जीसीसी में (AFAIK प्रति-फ़ाइल) मैक्रो है जिसे __COUNTER__ कहा जाता है जो प्रत्येक उपयोग के बाद एक से बढ़ता है।

ध्यान दें कि यह एक एक्सटेंशन है और मानक C++ में शामिल नहीं है।

एक अन्य विकल्प एक enum उपयोग कर रहा है:

enum { 
    FIRST = 0, 
    SECOND, 
    THIRD 
}; 

या आप मैन्युअल रूप से इस तरह पूर्वप्रक्रमक निर्देशों का उपयोग कर ऐसा कर सकते हैं: विरासत और समारोह के साथ,

#define FIRST 0 
#define SECOND (1 + FIRST) 
#define THIRD (1 + SECOND) 
+0

नवीनतम युक्ति के बारे में क्या: यह उपयोगी है जब सब कुछ एक फ़ाइल है, मुझे अलग-अलग की आवश्यकता है और कुछ प्रोग्रामर इस कोड को इतना संभव संघर्ष संपादित करेंगे। – Ockonal

+2

कृपया SECOND और THIRD को परिभाषित करते समय माता-पिता का उपयोग करें। – robert

+0

@robert: आप सही हैं, ठीक है। – orlp