कम से कम जीसीसी 5.4.0 में, Cygwin (default -std=gnu11
) पर, आप यही चाहते करने के लिए प्रकट होता है (यह मानते हुए मैं आपके सवाल का सही ढंग से समझ):
#define C(a...) (char *[]){ a 0 }
^no comma!
C("a", "b",)
^comma here
=> (char *[])("a", "b", 0 }
C()
=> (char *[]){ 0 }
gcc -E
और कोई अन्य आदेश-पंक्ति के साथ परीक्षण किया गया विकल्प।
संपादित करें @KerrekSB ने नोट किया, यह पोर्टेबल नहीं है। GCC preprocessor docs इस कहना है (जोर जोड़ा):
ऊपर स्पष्टीकरण मामले में जहां केवल मैक्रो पैरामीटर किसी चर तर्क पैरामीटर है के बारे में अस्पष्ट है, के रूप में यह है [इस स्थिति-एड के रूप में।] इस बात को अलग करने की कोशिश करने के लिए अर्थहीन है कि कोई तर्क बिल्कुल खाली तर्क या अनुपलब्ध तर्क नहीं है। इस मामले में सी 99 मानक स्पष्ट है कि अल्पविराम अवश्य ही रहना चाहिए, हालांकि मौजूदा जीसीसी विस्तार अल्पविराम को निगलने के लिए उपयोग किया जाता है। तो सीपीपी एक विशिष्ट सी मानक के अनुरूप होने पर अल्पविराम को बरकरार रखता है, और इसे अन्यथा छोड़ देता है।
तो उपरोक्त काम जीसीसी में ठीक काम करता है, लेकिन अन्य कंपाइलरों पर नहीं हो सकता है। हालांकि, यह मेरे लिए gcc -std=c90 -E
(या c99
, या c11
) के साथ काम करता है।
इस समय ऐसा करने के लिए कोई पोर्टेबल तरीका नहीं है। (मेरा मानना है कि एक लंबित प्रस्ताव है जो आपको इस तरह कुछ बनाने की इजाजत देता है।) –
मेरा मतलब है, बूस्ट.प्रप्रोसेसर पर एक नज़र डालें, हो सकता है कि * कुछ * प्रकार का जादू हो जो इसे प्राप्त कर सके। (जो सी में भी काम करना चाहिए।) –
मेह ठीक है, अगर यह संभव था तो मैं उत्सुक था। चूंकि यह नहीं है, मैं बस कुछ परिभाषित करता हूं जैसे '#define C0 (char * []) {0} ' –