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?