Collage de jetons en C

Après avoir lu à propos de VA_NARG

J’ai essayé d’implémenter la surcharge de fonctions en fonction du nombre d’arguments en C à l’ aide de macros. Maintenant le problème est:

void hello1(char *s) { ... } void hello2(char *s, char *t) { ... } // PP_NARG(...) macro returns number of arguments :ref to link above // does not work #define hello(...) hello ## PP_NARG(__VA_ARGS__) int main(void) { hello("hi"); // call hello1("hi"); hello("foo","bar"); // call hello2("foo","bar"); return 0; } 

J’ai lu ceci du C-faq. Mais je ne pouvais toujours pas le faire fonctionner …

Cela est dû aux règles d’évaluation des macros. Vous devez définir une sorte de macro d’assistance qui reçoit le nombre sous forme de jeton:

 #define HELLO_1(N, ...) hello ## N #define HELLO_0(N, ...) HELLO_1(N, __VARGS__) #define HELLO(...) HELLO_0(PP_NARG(__VA_ARGS__), __VARGS__) 

ou alors Vous pouvez également consulter la version préliminaire de la documentation de P99 . Cela vous fournira des outils macro plus confortables pour le faire directement.

Ce PP_NARG est un morceau de folie plutôt impressionnant!

En suivant l’exemple de glue dans la norme C99 (6.10.3.5, exemple 4), les résultats suivants sont obtenus:

 #define glue(a, b) a ## b #define xglue(a, b) glue(a, b) #define hello(...) xglue(hello, PP_NARG(__VA_ARGS__))(__VA_ARGS__) 

Je n’ai pas de compilateur C99 à vérifier, mais cela devrait fonctionner:

 #define helloN(N, ...) hello ## N (__VA_ARGS__) #define hello(...) helloN(PP_NARG(__VA_ARGS__), __VA_ARGS__)