2011-02-09 423 views
2

我想拿出一個宏做一些像下面陣列初始化宏

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

,擴大到,

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

這可能有/無編譯器特定的魔力?我不希望直接傳遞數組。

編輯:我已經在使用公認的答案從變參以下SO問題,

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

所以我能找到多少元素在數組中。

+0

你的宏究竟做了什麼? – karlphillip 2011-02-09 18:28:50

+0

你想要的是任意數量的參數,不可能完全像寫入的那樣,但我很困惑你爲什麼要傳遞指向每個數組元素的單個指針到函數調用。只要傳遞一個指向第一個元素的指針就可以。 – 2011-02-09 18:34:34

回答

3

你可以用(C99,不GCC特異性)啓動:

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

my_call部分將更加困難;有在線的宏可以計算參數的數量,但是您需要像Boost.Preprocessor(它應該用C語言)將my_call應用於數組的連續元素。你有多少元素最多?你可能想要類似的東西:

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

等等。