2012-07-27 15 views
7

हित के बाहर:मैक्रो विस्तार और स्ट्रिंगफिकेशन: मैक्रो नाम (इसका मूल्य नहीं) कैसे प्राप्त करें मैक्रो का उपयोग करके स्ट्रिंग किया गया?

#define _ACD 5, 5, 5, 30 

#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD 

#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS } 

DEFAULT_NETWORK_TOKEN_KEY_CLASS मैक्रो केवल कैसे प्राप्त करने के लिए _ACD एक स्थिरांक अहस्ताक्षरित चार [] में stringified का उपयोग करना।

const uint8 startMsg[] = ?? DEFAULT_NETWORK_TOKEN_KEY_CLASS ; 

_ACD केवल परिणाम देगा।

यहां _ACD प्राप्त करने के लिए सही मैक्रो विस्तार क्या होगा। How to stringify macro having array as #define a_macro {5,7,7,97}?

+1

मुझे लगता है कि यह संभव नहीं है:

निम्नलिखित कोड समाधान दिखाता है। लेकिन मुझे पता है कि कुछ भी असंभव नहीं है। किसी को ? – Rick2047

उत्तर

7

के संदर्भ में (एक बहुत अच्छे कारण के बिना सी पूर्वप्रक्रमक का दुरुपयोग नहीं कर के बारे में मानक अस्वीकरण यहाँ लागू होता है।)

यह निश्चित रूप से आप क्या करना चाहते हो सकता है। आपको 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; 
} 
+0

बिल्कुल सही जवाब। ** _ एडीसी ** आउटपुट। मैंने आज बहुत कुछ सीखा। धन्यवाद – Rick2047

संबंधित मुद्दे