स्ट्रिंग शाब्दिक के रूप में मैक्रो तर्क का उपयोग कैसे करें?


90

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक मैक्रो कैसे लिखा जाए जो एक चर नाम के दोनों स्ट्रिंग शाब्दिक प्रतिनिधित्व के साथ-साथ चर को एक फ़ंक्शन में बदल देगा।

उदाहरण के लिए निम्नलिखित फ़ंक्शन दिए गए हैं।

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

मैं एक मैक्रो लिखना चाहता हूं ताकि मैं यह कर सकूं:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

जो प्रिंट आउट होगा: my_val: 5

मैंने निम्नलिखित करने की कोशिश की:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

हालाँकि, जैसा कि आप अनुमान लगा सकते हैं, उद्धरणों के अंदर VAR को प्रतिस्थापित नहीं किया जाता है, लेकिन केवल स्ट्रिंग शाब्दिक "VAR" के रूप में पारित किया जाता है। इसलिए मैं जानना चाहूंगा कि क्या मैक्रो तर्क को एक स्ट्रिंग शाब्दिक में बदलने का एक तरीका है।


आप इसे कैसे उपयोग करने की कोशिश कर रहे हैं?
क्रिस

जवाबों:



28

आप स्ट्रिंगर ऑपरेटर का उपयोग करना चाहते हैं:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

शायद आप इस समाधान की कोशिश करें:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";

यह प्रश्न का उत्तर कैसे देता है या यह कैसे सहायक है?
जिरिगासिक

1
@ जिरिगासिक - यह अन्य उत्तरों के विपरीत, मैक्रो विस्तार की स्ट्रिंग प्रस्तुति प्राप्त करने की अनुमति देता है
grepcake

3
मुझे लगता है कि यह समझाना उपयोगी होगा कि सिर्फ QUDI(x)होना ही काफी नहीं है।
LRDPRDX

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

मुझे पूरी तरह से यकीन नहीं है, लेकिन ऐसा लगता है कि "Hello" #x"(और #x "Hello") स्ट्रिंग को अंतरिक्ष के बिना एक साथ चिपके होने का कारण बनता है, जो कि कुछ मामलों में वांछित है, इसलिए यह काफी अच्छा जवाब है।
स्मार

1
@Smar सुनिश्चित करें कि आप लगातार स्ट्रिंग के बाद एक स्थान रखते हैं नमस्ते: "Hello " #x
जैक

ठीक है मैंने ऐसा सोचा था, आपको अपने उत्तर को संपादित करना चाहिए, क्योंकि यह बहुमूल्य जानकारी है :)
Smar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.