सी प्रीप्रोसेसर का उपयोग करके स्ट्रिंग को कॉनटेननेट करें


90

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

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

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

यह काम नहीं करता है।

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

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

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

#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

जवाबों:


171

क्लासिकल C प्रीप्रोसेसर प्रश्न…।

#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)

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


3
एसटीआर () इस मामले में एक संकीर्ण स्ट्रिंग देगा। क्या इसे एक विस्तृत स्ट्रिंग में बदलने के लिए भिन्नता है?
अक्टूबर को सुबह ५:१६ से .:

5
मैं यह नहीं कह सकता था कि मैंने इसे कितनी बार googled और इस सटीक उत्तर से कॉपी किया, लेकिन यह दोहरे अंकों में होने जा रहा है
MightyPork

1
पहला "STR_HELPER" आवश्यक है क्योंकि '#' केवल एक मैक्रो तर्क के साथ काम करता है। मुझे यह पता लगाने में कुछ समय लगा कि ..
क्लार्कटफू

1
@clarkttfu, की तरह - हाँ, #केवल मैक्रो तर्कों के साथ काम करता है। हालांकि, STR_HELPERमैक्रो MAJOR_VERको स्ट्रिंग में बदलने से बचने के लिए आवश्यक है "MAJOR_VAR", हम चाहते हैं कि परिणाम होना चाहिए "2"
लिंडनाइडर

13

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

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

EDIT: जैसा कि "लिंडनाइडर्स" द्वारा उल्लेख किया गया है, यह समाधान तर्कों में मैक्रोज़ का विस्तार नहीं करता है। एक अधिक सामान्य समाधान है:

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

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

5
यह एक साफ समाधान है, जो दुर्भाग्य से, काम नहीं करता है। यदि तर्क MY_FILEमैक्रो के लिए पारित कर दिया गया है , कहते हैं Aऔर B, इस मैक्रो का विस्तार होगा "/home..." "A" "B"
लिंडकेसर

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)

28
मुझे मुस्कुराता है कि कैसे लोग हर चीज पर बूस्ट फेंकते हैं।
फ्रैरिच राबे

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

@jonescb: सिर्फ बूस्टर हेडर खोलें और अपने लिए देखें।
मैक्सिम Egorushkin

10
हां, मैंने कोशिश की। यह काम किया है, लेकिन एक सी कार्यक्रम में बूस्ट हैडर का उपयोग करना मुझे अजीब लगता है।
जोंसकब

1
ओह, मेरा बुरा, Cटैग नहीं लगा ।
मैक्सिम एगोरुस्किन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.