के कुछ तरीके हैं यह करने के लिए कर रहे हैं:
यदि आप, तो आप बस बस तार का उपयोग उपयोग कर सकते हैं केवल स्ट्रिंग शाब्दिक साथ काम कर रहे हैं - एक स्ट्रिंग शाब्दिक देने के बाद एक और उन्हें श्रेणीबद्ध करने के लिए संकलक का कारण बनता है ।
अगर वहाँ स्ट्रिंग शामिल शाब्दिक के अलावा अन्य चीजों (यानी।, आप मैक्रो से नया पहचानकर्ता पैदा कर रहे) का उपयोग '##
"पूर्वप्रक्रमक टोकन चिपकाने ऑपरेटर। आप शायद भी उपयोग करने की आवश्यकता होगी' #
'हो सकता है 'stringizing ऑपरेटर शाब्दिक स्ट्रिंग में अपने मैक्रो बनाने के लिए
# 1 का एक उदाहरण:।
#ifdef __TESTING
#define IV_DOMAIN "domain.org" //in house testing
#elif __LIVE_TESTING
#define IV_DOMAIN "test.domain.com" //live testing servers
#else
#define IV_DOMAIN "domain.com" //production
#endif
// Sub-Domain
#define IV_SECURE "secure." IV_DOMAIN //secure.domain.org etc
#define IV_MOBILE "m." IV_DOMAIN
और जहाँ तक टोकन चिपकाने ऑपरेटर चला जाता है, मुझे नहीं लगता कि के सबसे कि जवाब जो सुझाव देता है टोकन पेस्टिंग प्रीप्रोसेसर ऑपरेटर का उपयोग करके टेड ने वास्तव में कोशिश की है - यह उपयोग करने में मुश्किल हो सकती है।
, जवाब है कि अक्सर एक संकलक त्रुटि हो जब तुम IV_SECURE
मैक्रो का उपयोग करने की कोशिश करेंगे सुझाव का उपयोग करना है क्योंकि:
#define IV_SECURE "secure."##IV_DOMAIN
फैलता करने के लिए:
"secure"domain.org
आप का प्रयास करना चाहें '
# `'' स्ट्रिंगिंग 'ऑपरेटर का उपयोग करने के लिए:
#define IV_SECURE "secure." #IV_DOMAIN
लेकिन था टी काम नहीं करेगा क्योंकि यह केवल मैक्रो तर्कों पर काम करता है - न केवल किसी पुराने मैक्रो।
जब आप टोकन-पेस्ट ('##') या स्ट्रिंगिंग ('#') प्रीप्रोसेसिंग ऑपरेटरों का उपयोग कर रहे हैं, तो यह जानना एक बात है कि आपको उनके लिए सही तरीके से काम करने के लिए एक अतिरिक्त स्तर का संकेत देना है सभी मामलों में।
यदि आप ऐसा नहीं करते हैं और टोकन-पेस्ट ऑपरेटर के लिए पारित आइटम मैक्रो खुद को कर रहे हैं, आप परिणाम है कि शायद कर रहे हैं मिल जाएगा कि तुम क्या नहीं करना चाहता:
#include <stdio.h>
#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)
#define BAD_PASTE(x,y) x##y
#define BAD_STRINGIFY(x) #x
#define SOME_MACRO function_name
int main()
{
printf("buggy results:\n");
printf("%s\n", STRINGIFY(BAD_PASTE(SOME_MACRO, __LINE__)));
printf("%s\n", BAD_STRINGIFY(BAD_PASTE(SOME_MACRO, __LINE__)));
printf("%s\n", BAD_STRINGIFY(PASTE(SOME_MACRO, __LINE__)));
printf("\n" "desired result:\n");
printf("%s\n", STRINGIFY(PASTE(SOME_MACRO, __LINE__)));
}
उत्पादन:
buggy results:
SOME_MACRO__LINE__
BAD_PASTE(SOME_MACRO, __LINE__)
PASTE(SOME_MACRO, __LINE__)
desired result:
function_name21
तो ऊपर से अपने मूल IV_DOMAIN
परिभाषित करता है और utilty मैक्रो का उपयोग कर, आप ऐसा कर सकता है आप क्या चाहते हैं पाने के लिए:
// Sub-Domain
#define IV_SECURE "secure." STRINGIFY(IV_DOMAIN) //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY(IV_DOMAIN)
संभावित डुप्लिकेट [एक प्रोप्रोसेसर टोकन को एक स्ट्रिंग में कनवर्ट करें] (http://stackoverflow.com/questions/240353/convert-a-preprocessor -टेकन-टू-ए-स्ट्रिंग) –