2016-09-02 18 views
13

मैं इस तरह एक मैक्रो:सी प्रीप्रोसेसर निकालें ट्रेलिंग कॉमा

#define C(a...) (char *[]){ a, 0 } 

यह गैर खाली तर्क के लिए काम करता है:

C("a", "b") => (char *[])("a", "b", 0 } 

लेकिन मैं जब एक खाली के साथ प्रदान की अनुगामी अल्पविराम निकालना चाहते हैं तर्क:

C() => (char *[]){ , 0 } 

क्या यह संभव है?

+1

इस समय ऐसा करने के लिए कोई पोर्टेबल तरीका नहीं है। (मेरा मानना ​​है कि एक लंबित प्रस्ताव है जो आपको इस तरह कुछ बनाने की इजाजत देता है।) –

+0

मेरा मतलब है, बूस्ट.प्रप्रोसेसर पर एक नज़र डालें, हो सकता है कि * कुछ * प्रकार का जादू हो जो इसे प्राप्त कर सके। (जो सी में भी काम करना चाहिए।) –

+0

मेह ठीक है, अगर यह संभव था तो मैं उत्सुक था। चूंकि यह नहीं है, मैं बस कुछ परिभाषित करता हूं जैसे '#define C0 (char * []) ​​{0} ' –

उत्तर

4

कम से कम जीसीसी 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) के साथ काम करता है।

+0

यह मैक्रो के प्रत्येक आमंत्रण में पिछली कॉमा टाइप करने के लिए एक सौंदर्य भावना में मामूली उपद्रव है, जो व्यक्तिगत रूप से बोलना इसके लायक नहीं है, लेकिन तकनीकी रूप से इस प्रश्न के लिए केवल एकमात्र (अभी के लिए) वास्तविक कार्यप्रणाली दिखता है। –

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