6
votes

Expansion de macro récursive à une séquence

est-il possible de définir une macro C / C ++ " (A, I) " qui se développe à " x [0], x [1], x [2], ..., x [i] "? Comme dans xxx

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?

Je voudrais appeler une fonction f (int, ... ) qui prend n int Arguments x [i] , 0 <= i CEIL (Tailleof (A) / Tailleof (B)) . Donc, malheureusement, je ne peux pas utiliser de varargs ou de modèles.


3 commentaires

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?


3 Réponses :


3
votes

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".


1 commentaires

Merci, j'ai supprimé la balise variadique.



15
votes

Il est possible, mais vous devez faire du travail manuel et avoir une limite supérieure.

#define FOO 42
BUILD(x, FOO)


3 commentaires

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?



0
votes

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; 
}


1 commentaires

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)