2011-02-09 3 views
2

Je suis en train de trouver une macro pour faire quelque chose comme ce qui suit,Tableau Initialisation Macro

MY_MACRO(type,name,args...) 
MY_MACRO(int,_array,1,2,3) 

et dépliement

int _array[] = {1,2,3}; 
coll* __array = my_call(&array[0],&array[1],&array[2]); 

est-ce possible avec/sans magie spécifique du compilateur? My_call s'attend à un nombre variable d'arguments et je ne veux pas passer le tableau directement.

EDIT: J'utilise déjà la réponse acceptée de la question suivante SO pour args var,

Macro returning the number of arguments it is given in C?

Je peux trouver combien d'éléments sont dans le tableau.

+0

Qu'est-ce que votre macro fait après tout? – karlphillip

+0

Ce que vous voulez n'est pas possible pour un nombre arbitraire d'arguments, exactement comme écrit, mais je suis confus pourquoi vous voulez passer des pointeurs individuels à chaque élément du tableau à l'appel de la fonction. Juste passer un pointeur sur le premier élément serait tout aussi bon. –

Répondre

3

Vous pouvez commencer avec (C99, non GCC spécifique):

#define MY_MACRO(type, name, ...) \ 
    type name[] = {__VA_ARGS__}; 

La partie my_call sera plus difficile; il y a des macros en ligne qui peuvent compter le nombre d'arguments, mais vous aurez besoin de quelque chose comme Boost.Preprocessor (qui devrait fonctionner en C) pour appliquer my_call aux éléments consécutifs du tableau. Combien d'éléments avez-vous au maximum? Vous pourriez vouloir quelque chose comme:

#define COUNT(...) COUNT2(__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) 
#define COUNT2(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, count, ...) count 
#define PP_CAT(a, b) PP_CAT2(a, b) 
#define PP_CAT2(a, b) a ## b 
#define CALL_MY_FUNC(arr, ...) my_call(PP_CAT(ITER_, COUNT(__VA_ARGS__))(arr)); 
#define ITER_0(arr) /**/ 
#define ITER_1(arr) (arr) 
#define ITER_2(arr) (arr), ITER_1((arr) + 1) 
#define ITER_3(arr) (arr), ITER_2((arr) + 1) 
#define ITER_4(arr) (arr), ITER_3((arr) + 1) 

et ainsi de suite.

+0

Beau, ça marche sur gcc 4.4.3 – karlphillip

+0

J'ai édité la réponse il y a quelques minutes pour essayer de résoudre la deuxième partie de votre problème. S'il vous plaît voir si cela fonctionne aussi. –

+0

Édité la question J'ai une macro en place pour compter le nombre d'arguments d'une autre question, mais je suis bloqué à l'appel my_call –