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__)