2016-09-08 42 views
0

我曾在C數組:如何將數組的總元素作爲函數的位置參數傳遞?

int array[] = {1, 2, 3, 4}; 

,我有一個功能的樣機是這樣的:

int add_all(int a, int b, int c, int d); 

但我怎麼能傳遞數組的所有元素作爲函數的參數在同一時間?

我知道蟒蛇,這可以這樣進行:

array=[1,2,3,4] 
add_all(*array) 

有人能告訴我如何實現在C相同的效果?

+0

@ AhmedM.Farrag添加與問題無關的標籤,因此您可以發佈依賴於該標籤的答案並不好。 – 2501

+0

@ 2501:好的。得到它了。 –

回答

1

使用此:

int add_all(array, 4); 

當調用一個函數,並嘗試把它傳遞一個數組,該數組 將被轉換爲一個指針數組的第一個元素。

函數原型

int add_all(int[] , int size); 

int add_all(int* , int size); 
+0

謝謝。我知道你說了什麼,但我不想改變我的功能。所以在傳遞參數的過程中我需要一些神奇的方法。 – RyanLi

+1

@RyanLi沒有神奇的方法,你將不得不傳遞4個參數。您可以更改函數或編寫函數包裝器。 – 2501

+1

@ 2501謝謝。也許功能包裝確實是我需要的。那麼,你能告訴我如何根據我的問題編寫一個包裝器。我會很感激。 – RyanLi

4

試試這個:

#include <boost/preprocessor/arithmetic/add.hpp> 
#include <boost/preprocessor/control/while.hpp> 
#include <boost/preprocessor/tuple/elem.hpp> 
#include <boost/preprocessor/tuple/push_back.hpp> 
#include <boost/preprocessor/tuple/reverse.hpp> 

#define ARRAY_ELEM(x,n) x[n] 

#define PRED(n, state) BOOST_PP_TUPLE_ELEM(3, 1, state) 

#define OP(d, state) \ 
    OP_D(\ 
     d, \ 
     BOOST_PP_TUPLE_ELEM(3, 0, state), \ 
     BOOST_PP_TUPLE_ELEM(3, 1, state), \ 
     BOOST_PP_TUPLE_ELEM(3, 2, state) \ 
    ) 

#define OP_D(d, res, c, arr_name) \ 
    (\ 
     BOOST_PP_TUPLE_PUSH_BACK(res,ARRAY_ELEM(arr_name,BOOST_PP_DEC(c))), \ 
     BOOST_PP_DEC(c), \ 
     arr_name \ 
    ) \ 


#define UNPACK_REVERSE(ARR_NAME,N) \ 
    BOOST_PP_TUPLE_ELEM(\ 
     3, 0, \ 
     BOOST_PP_WHILE(PRED, OP, ((ARRAY_ELEM(ARR_NAME,BOOST_PP_DEC(N))), \ 
        BOOST_PP_DEC(N),ARR_NAME)) \ 
    ) 
/*The macro to be called*/ 
#define UNPACK(ARR_NAME,N) \ 
    BOOST_PP_TUPLE_REVERSE(UNPACK_REVERSE(ARR_NAME,N)) 

下面是一個使用示例:

void print3(int x, int y, int z){ 
    printf("%d,%d,%d\n",x,y,z); 
} 
int main(){ 
    int z[3]={1,2,3}; 
    print3 UNPACK(z,3); 
    return 0; 
} 

此宏在循環中使用Boost的預處理程序庫來生成並展開元組中的數組元素。希望能幫助到你。

+0

不錯的方法:+1 –

+0

非常好,謝謝。但是我正在使用C語言,所以我不熟悉C++中的Boost庫。 – RyanLi

+0

@RyanLi:這是C而不是C++。 –

相關問題