2015-09-11 4 views
5

मैं इस तरह एक सी मैक्रो-निर्धारित उत्पाद संस्करण है कहते हैं:एक स्ट्रिंग निरंतर में एक मैक्रो तर्क कन्वर्ट और खाते के लिए अल्पविराम में रखना

#define FOO_VERSION 1,0,0,1 

और मैं रन-टाइम में यह प्रिंट करना चाहते हैं:

#define STRING_VALUE(x) #x 

int main() 
{ 
    std::cout << STRING_VALUE(FOO_VERSION) << std::endl; 
} 

यह एक स्ट्रिंग "FOO_VERSION" आउटपुट करेगा, न कि "1,0,0,1"। मैक्रो तर्क 'FOO_VERSION' को प्रतिस्थापित नहीं किया गया है। इसलिए मैं यह इस तरह फिर से कोशिश:

#define STRING_VALUE(x) STRING_VALUE__(x) 
#define STRING_VALUE__(x) #x 

int main() 
{ 
    std::cout << STRING_VALUE(FOO_VERSION) << std::endl; 
} 

यह काम करता है, विजुअल C++ 2013

यह एक पार मंच आवेदन यद्यपि वहाँ कोड का केवल पांच लाइनें हैं है में। जब मैं कोड संकलित करने के लिए क्लैंग का उपयोग करता हूं, तो एक संकलन- समय त्रुटि प्रकट होती है: "फ़ंक्शन-जैसे मैक्रो आमंत्रण के लिए प्रदान किए गए बहुत से तर्क"। मुझे लगता है कि कारण 'FOO_VERSION' में परिभाषित अल्पविराम है। तो तीसरे संस्करण:

#define STRING_VALUE(x) STRING_VALUE__(x) 
#define STRING_VALUE__(a, b, c, d) #a "," #b "," #c "," #d 

int main() 
{ 
    std::cout << STRING_VALUE(FOO_VERSION) << std::endl; 
} 

इस कोड बजना में काम करता है, लेकिन विजुअल C++ इच्छा उत्पादन एक चेतावनी: संकलन समय पर "नहीं पर्याप्त वास्तविक 'STRING_VALUE__' मैक्रो के लिए पैरामीटर", बेशक रन-टाइम आउटपुट सही नहीं है।

मेरा प्रश्न: क्या यह प्री-प्रोसेसर व्यवहार परिभाषित किया गया है? क्या मेरे पास STRING_VALUE मैक्रो का सार्वभौमिक संस्करण हो सकता है?

उत्तर

10

आप एक ही variadic मैक्रो के रूप में तर्क का इलाज कर सकते हैं:

#define FOO_VERSION 1,0,0,1 

#define STRING_VALUE(...) STRING_VALUE__(__VA_ARGS__) 
#define STRING_VALUE__(...) #__VA_ARGS__ 

यह जीसीसी और विजुअल C++ के साथ काम करने लगता है।

+0

मैंने ऐसा क्यों नहीं सोचा? – amanjiang

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