He who is Shy* ने आपको answer का रोगाणु दिया, लेकिन केवल रोगाणु। सी पूर्व प्रोसेसर में एक स्ट्रिंग में कोई मान परिवर्तित करने के लिए बुनियादी तकनीक '#' ऑपरेटर के माध्यम से वास्तव में है, लेकिन प्रस्तावित समाधान का एक सरल लिप्यंतरण एक संकलन त्रुटि हो जाता है:
#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
सिंटेक्स त्रुटि पर है 'puts()' रेखा - समस्या स्रोत में 'stray #' है।
सी मानक की धारा 6.10.3.2 में, '# ऑपरेटर', यह कहते हैं:
Each # preprocessing token in the replacement list for a function-like macro shall be followed by a parameter as the next preprocessing token in the replacement list.
मुसीबत यह है कि आप तार करने के लिए मैक्रो तर्क में बदल सकते हैं - लेकिन आप यादृच्छिक परिवर्तित नहीं कर सकते वे आइटम जो मैक्रो तर्क नहीं हैं।
तो, आपके बाद के प्रभाव को प्राप्त करने के लिए, आपको निश्चित रूप से कुछ अतिरिक्त कार्य करना होगा।
#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME FUNCTION_NAME(test_func)
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
मैं कैसे आप मैक्रो का उपयोग करने की योजना पर पूरी तरह से स्पष्ट नहीं कर रहा हूँ, और आप कैसे पुनरावृत्ति पूरी तरह से बचने के लिए योजना है। यह थोड़ा अधिक विस्तृत उदाहरण अधिक जानकारीपूर्ण हो सकता है। STR_VALUE के समतुल्य मैक्रो का उपयोग एक मुहावरे है जो वांछित परिणाम प्राप्त करने के लिए आवश्यक है।
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name)
#define TEST_FUNC test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#include <stdio.h>
static void TEST_FUNC(void)
{
printf("In function %s\n", TEST_FUNC_NAME);
}
int main(void)
{
puts(TEST_FUNC_NAME);
TEST_FUNC();
return(0);
}
* समय था जब इस उत्तर पहले लिखा गया, shoosh नाम के हिस्से के रूप के नाम का इस्तेमाल किया 'शर्मीली'।
स्रोत
2008-10-12 20:35:11
की संभावित डुप्लिकेट [सी मैक्रो तार बनाने के लिए] (http://stackoverflow.com/questions/798221/c-macros -to-create-strings) – rjstelling