est-il possible de définir une macro C / C ++ " il semble boost_pp_enum_params pouvait faire le travail. Je suppose que je pouvais simplement augmenter, mais je suis intéressé à savoir comment et pourquoi cela fonctionne, tout le monde peut expliquer? P> Je voudrais appeler une fonction (A, I) code>" qui se développe à "
x [0], x [1], x [2], ..., x [i] code> "? Comme dans
f (int, ... ) code> qui prend n int Arguments
x [i] code>, 0 <= i
3 Réponses :
Non, ce n'est pas - les macros ne peuvent pas être récursifs. Et les macros que vous avez postés ne sont pas variadic, ce qui signifie "avoir un nombre différent de paramètres". P>
Merci, j'ai supprimé la balise variadique.
Il est possible, mais vous devez faire du travail manuel et avoir une limite supérieure.
#define FOO 42 BUILD(x, FOO)
Merci, c'est intéressant comment build1..build3 sont presque identiques ... ne pouvait pas avoir quelque chose comme #define build_ (x, j) build_ (x, j-1), x [J]
Il n'aurait pas une condition d'arrêt et les macros ne peuvent pas être récursifs pour démarrer.
"Son nom m'échappe" Faites-vous référence au chaos pp?
OK, J'ai eu le même problème, mon objectif était d'imprimer toutes les valeurs d'un tableau de n octets en utilisant des macros. Je suppose que vous aviez à peu près le même problème. Si tel était le cas, cette solution devrait convenir à des problèmes similaires futurs.
#define HEX_ARRAY_AS_STR(array, len) \ ({ \ int print_counter = 0; \ print_buf = calloc(len*3+1, 1); \ char *tmp_print_buf = print_buf; \ uint8_t *array_flower = array; \ while(print_counter++ < (len)){ \ sprintf(tmp_print_buf, "%02X ", *(array_flower)++); \ tmp_print_buf += 3; \ } \ print_buf; \ }) #define eprintf(...) \ do{ \ char *print_buf; \ printf(__VA_ARGS__); \ if(print_buf) \ free(print_buf); \ }while(0) int main(int argc, char *argv[]) { uint8_t sample[] = {0,1,2,3,4,5,6,7}; eprintf("%s\n", HEX_ARRAY_AS_STR(sample, 8)); return 0; }
Non, ce n'est pas ce que j'essayais de faire. Quoi qu'il en soit, si vous passez toujours un tableau à hex_array_as_str, vous pouvez vous débarrasser du deuxième paramètre à l'aide de Tiplôme (matrice) / Tailleof (uint8_T)
Connexes: Stackoverflow.com / Questions / 824639 / ...
Quel problème essayez-vous vraiment de résoudre? c'est à dire. À quoi sert le résultat de cette macro? L'utilisation peut-elle être modifiée légèrement pour permettre une solution de modèle (où la récursion est possible)?
Alors pourquoi pas seulement passer le tableau? Ou mieux encore un vecteur?