2017-12-30 30 views
-1

ist Wie Sie sehen ein Token Werke verketten,
auch ein Token ein anderes Makro funktioniert ist,
aber wenn ein Token ein Makro ist es scheint nicht zu Arbeit?GCC Precompilers Makro ##, mit Token verketten, die ein anderes Makro

longNameForaFunction_one(){return 1;} 
longNameForaFunction_two(){return 2;} 
longNameForaFunction_third(){return 3;} 
two(){return 2;} 
#define bar two 
#define foo(x)(longNameForaFunction_##x()) 
#define three third 
main(){ 
printf("%d\n",foo(one)); // 1 

printf("%d\n",foo(two)); // 2 

printf("%d\n",bar()); // 2 

// printf("%d\n",foo(three)); // this doesn't work 
} 

Die letzte Reihe gibt diesen Fehler wenn unkommentiert;

undefined reference to `longNameForaFunction_three‘

#define three third 

scheint keine Wirkung zu haben

Try it online

+1

Verwenden Sie mehr Leerraum. Verwende '#define EVALUATOR (x) x' und' #define CONCATENATE (x, y) x ## y' und dann '#define foo (x) CONCATENATE (longNameForaFunction_, EVALUATOR (x))'. Und das ist ein Duplikat. –

Antwort

1

Nun, das ist, warum Sie eine weitere Ebene zur Verfügung stellen müssen, bevor es funktioniert - das Makro Der Parameter wird erweitert, bevor er an foo übergeben wird.

#define foo(x)(longNameForaFunction_##x()) 
#define foo1(x) foo(x) 
#define three third 

.. 

printf("%d\n",foo1(three));