2011-03-28 11 views
57

मैं यह पता लगाने की कोशिश कर रहा हूं कि c प्रीप्रोसेसर का उपयोग करके मैं #define 'd int को #define' d स्ट्रिंग को कैसे जोड़ सकता हूं। मेरा कंपाइलर CentOS 5 पर जीसीसी 4.1 है। समाधान को MinGW के लिए भी काम करना चाहिए।सी प्रीप्रोसेसर का उपयोग कर स्ट्रिंग करने के लिए int intenenate

मैं एक स्ट्रिंग पर एक संस्करण संख्या जोड़ना चाहता हूं, लेकिन एकमात्र तरीका यह है कि मैं इसे काम पर ला सकता हूं, संस्करण संख्या की एक प्रति स्ट्रिंग के रूप में परिभाषित करना है।

मैक्रो तर्कों को उद्धृत करने का एक तरीका था जो मुझे मिल सकता था, लेकिन यह #define s

के लिए काम नहीं करता है यह काम नहीं करता है।

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER 

यह # s के बिना काम नहीं करता है क्योंकि मान संख्याएं हैं और यह "/home/user/.myapp" 2 6 तक विस्तारित होगा, जो वैध C मान्य नहीं है।

यह काम करता है, लेकिन मुझे संस्करण की प्रतियां परिभाषित नहीं करना पसंद है क्योंकि मुझे उन्हें संख्याओं के रूप में भी आवश्यकता है।

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MAJOR_VER_STR "2" 
#define MINOR_VER_STR "6" 
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING 
+3

की संभावित डुप्लिकेट [कन्वर्ट एक स्ट्रिंग के लिए एक पूर्वप्रक्रमक टोकन] (http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string) –

उत्तर

97

शास्त्रीय सी पूर्वप्रक्रमक सवाल ....

#define STR_HELPER(x) #x 
#define STR(x) STR_HELPER(x) 

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER) 

अविवेक की अतिरिक्त स्तर पूर्वप्रक्रमक से पहले मैक्रो का विस्तार करने की अनुमति देगा वे तारों में परिवर्तित हो जाते हैं।

+2

धन्यवाद। यह काम करता है, और यह एक बहुत साफ समाधान है। इस मामले में – jonescb

+0

एसटीआर() एक संकीर्ण स्ट्रिंग देगा। क्या इसे व्यापक स्ट्रिंग में बदलने के लिए कोई बदलाव है? – gkns

2

आप ऐसा कर सकते हैं BOOST_PP_STRINGIZE साथ:

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER) 
+20

मुझे smirk बनाता है कि कैसे लोग सब कुछ पर बूस्ट फेंक देते हैं। –

+4

@Frerich: चरम, लोगों को अपना तर्क लेते हुए अपने स्वयं के compilers बल्कि ++ सब कुछ ... पर कोई बिंदु फेंकने जी पहिया बदलने की तुलना में, कच्चे मशीन कोड में पहले लिखना चाहिए। अच्छे प्रोग्रामर कोड लिखते हैं, महान लोग पुन: उपयोग करते हैं। –

+0

@jonescb: बस खुला [बढ़ावा हैडर] (http://svn.boost.org/svn/boost/trunk/boost/preprocessor/stringize.hpp) और खुद के लिए देखते हैं। –

8

एक काम कर रास्ता MY_FILE एक पैरामीट्रिक मैक्रो के रूप में लिखने के लिए:

#define MY_FILE(x,y) "/home..." #x #y 

संपादित करें: "Lindydancer" द्वारा बताया गया है, इस समाधान बहस में मैक्रो का विस्तार नहीं करता है। एक अधिक सामान्य समाधान है:

#define MY_FILE_(x,y) "/home..." #x #y 
#define MY_FILE(x,y) MY_FILE_(x,y) 
+1

अपनी ईमानदार राय में, यह सबसे अच्छा जवाब है, और अन्य सुझावों तुलना में बहुत सरल है। मुझे आश्चर्य है कि इसे बेहतर रेटिंग नहीं मिली! – osirisgothra

+3

यह एक साफ समाधान है, दुर्भाग्यवश, काम नहीं करता है। तर्क 'MY_FILE' के लिए पारित मैक्रो कर रहे हैं, कहते हैं कि' A' और 'b', इस मैक्रो' करने के लिए विस्तार होगा "/ घर ..." 'ए' 'बी' '। – Lindydancer

+1

सही है, लेकिन एक प्रसिद्ध कामकाज है (संपादन देखें)। –

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