के संदर्भ में (एक बहुत अच्छे कारण के बिना सी पूर्वप्रक्रमक का दुरुपयोग नहीं कर के बारे में मानक अस्वीकरण यहाँ लागू होता है।)
यह निश्चित रूप से आप क्या करना चाहते हो सकता है। आपको STRINGIFY
मैक्रो और मैक्रो इंडिकेशन का थोड़ा सा चाहिए।
आमतौर पर, STRINGIFY
को एक स्तर के संकेत के साथ परिभाषित किया जाता है, जिससे सी प्रीप्रोसेसर स्ट्रिंगफिकेशन से पहले अपने तर्कों का विस्तार करने की अनुमति देता है। एक कार्यान्वयन है:
/* The # operator converts symbol 'v' into a string */
#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)
लेकिन, आप पाएंगे कि यह पर्याप्त नहीं है:
#define _ACD 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }
#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
const char startMsg[] = START_MSG;
यहाँ, STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
STRINGIFY0(5,5,5,30)
के लिए विस्तारित, और सी पूर्वप्रक्रमक शिकायत है कि आप STRINGIFY0
भी दे दिया है कई तर्क
समाधान _ACD
के विस्तार में देरी करना है, इसलिए यह केवल 5,5,5,30
तक फैलता है जब आप इसे चाहते हैं। ऐसा करने के लिए एक समारोह की तरह मैक्रो के रूप में यह निर्धारित करें:
#define _ACD() 5, 5, 5, 30
इस तरह, _ACD
केवल जब आप इसे "कहते हैं" विस्तार किया जाएगा: _ACD()
। DEFAULT_NETWORK_TOKEN_KEY_CLASS
अब _ACD
तक विस्तारित होगा, और आपको इसे "कॉलिंग" द्वारा आगे विस्तार करना होगा: DEFAULT_NETWORK_TOKEN_KEY_CLASS()
।
#include <stdio.h>
#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)
#define _ACD() 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS() }
#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
const char startMsg[] = START_MSG;
int main(int argc, char** argv)
{
printf("%s\n",startMsg);
return 0;
}
मुझे लगता है कि यह संभव नहीं है:
निम्नलिखित कोड समाधान दिखाता है। लेकिन मुझे पता है कि कुछ भी असंभव नहीं है। किसी को ? – Rick2047