मैं सिर्फ कोशिश की है संयोजन:
#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 है।
ओह, वह दूसरी विधि शुद्ध बुराई है ;-) – Joey
'$' सी मानक के अनुसार पहचानकर्ता के लिए वैध चरित्र नहीं है। मुझे लगता है कि कुछ विशिष्ट कंपाइलर्स द्वारा इसे स्वीकार किया जा सकता है। –
@ डेल: हां, जीसीसी पहचानकर्ता के रूप में '$' का समर्थन करता है। http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html#Dollar- साइन इन – kennytm