2010-01-15 15 views
10

मैं सी प्री-प्रोसेसर मैक्रो बनाना चाहता हूं जो तर्क को सिंगल-कोट करेगा। सामान्य इस्तेमाल #X की तरह।मैक्रो में एक तर्क को सिंगल-कोट कैसे करें?

मैं Q(A)'A' पर विस्तारित करना चाहता हूं।

मैं लिनक्स पर जीसीसी का उपयोग कर रहा हूं।

क्या किसी के पास कोई विचार है?

मुझे पता है # डबल-कोट्स। मैं एकल-उद्धरण के लिए एक समान तंत्र की तलाश में हूं।

उत्तर

13

सबसे अच्छा तुम कर सकते हो

#define Q(x) ((#x)[0]) 

या

#define SINGLEQUOTED_A 'A' 
#define SINGLEQUOTED_B 'B' 
... 
#define SINGLEQUOTED_z 'z' 

#define Q(x) SINGLEQUOTED_##x 

यह केवल काम करता है a के लिए है।

+0

ओह, वह दूसरी विधि शुद्ध बुराई है ;-) – Joey

+1

'$' सी मानक के अनुसार पहचानकर्ता के लिए वैध चरित्र नहीं है। मुझे लगता है कि कुछ विशिष्ट कंपाइलर्स द्वारा इसे स्वीकार किया जा सकता है। –

+0

@ डेल: हां, जीसीसी पहचानकर्ता के रूप में '$' का समर्थन करता है। http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html#Dollar- साइन इन – kennytm

4
सबसे अच्छा मैं होगा

#define Q(A) (#A[0]) 

के बारे में सोच सकते हैं, लेकिन यह बेशक बहुत सुंदर नहीं है,

z, A - - Z, 0 - 9 और _ (और $ कुछ compilers के लिए)

4

दरअसल, #X डबल तर्क को उद्धृत करता है, जैसा कि आप निम्न कोड के साथ देख सकते हैं।

#define QQ(X) #X 
char const * a = QQ(A); 

साथ (बस पूर्वप्रक्रमक उत्पादन को देखने के लिए) gcc -E भागो यह आपके तर्क एकल उद्धरण के लिए

# 1 "temp.c" 
# 1 "<built-n>" 
# 1 "<command line>" 
# 1 "temp.c" 

char * a = "A" 

देखने के लिए (जो सी में मतलब है कि यह एक एकल वर्ण है)

#define Q(X) (QQ(X)[0]) 
char b = Q(B); 
subscripting का उपयोग

जो

char b = ("B"[0]); 
में परिवर्तित हो जाएगा
1

इस रूपांतरण होते:

#python 
for i in range(ord('a'), ord('n')): 
    print "#define BOOST_PP_CHAR_%s '%s'" % (chr(i), chr(i)) 

और इस पूर्वप्रक्रमक हिस्सा है:

#ifndef BOOST_PP_CHAR_HPP 
#define BOOST_PP_CHAR_HPP 

#define BOOST_PP_CHAR(c) BOOST_PP_CHAR_ ## c 
// individual declarations  

#endif // BOOST_PP_CHAR_HPP 
0

मैं सिर्फ कोशिश की है संयोजन:

#define APOS   ' 
#define CHAR2(a,b,c) a##b##c 
#define CHAR1(a,b,c) CHAR2(a,b,c) 
#define CHAR(x)  CHAR1(APOS,x,APOS) 

दुर्भाग्य से, हालांकि, पूर्वप्रक्रमक एक समाप्त नहीं की गई के बारे में शिकायत चरित्र।(और multicharacter यदि आप एक से अधिक चरित्र है) एक तरह से करने के लिए सिर्फ अक्षम पूर्वप्रक्रमक त्रुटियों:

:

-no-integrated-cpp -Xpreprocessor -w 

कुछ कुछ अन्य चाल के साथ संकलन समय अनुकूलन उदाहरण (वहाँ इस के लिए कोई विशेष चेतावनी विकल्प है)

#define id1_id  HELP 
#define id2_id  OKAY 

#define LIST(item,...) \ 
    item(id1, ##__VA_ARGS__)\ 
    item(id2, ##__VA_ARGS__)\ 
    item(id1, ##__VA_ARGS__)\ 

#define CODE(id,id2,...) ((CHAR(id##_id) == CHAR(id2##_id)) ? 1 : 0) + 
int main() { printf("%d\n", LIST(CODE,id1) 0); return 0; } 

यह "2" देता है, क्योंकि वहां दो आइटम हैं जिनमें आईडी 1 है।

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