我在c:
中有一个数组int array[] = {1, 2, 3, 4};
我有一个像这样的函数原型:
int add_all(int a, int b, int c, int d);
但是如何一次将数组的所有元素作为函数的参数传递?
我知道在python中,这可以这样做:
array=[1,2,3,4]
add_all(*array)
有人能告诉我如何在C中达到同样的效果吗?
答案 0 :(得分: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的预处理器库来生成和扩展元组中的数组元素。希望它有所帮助。
答案 1 :(得分:1)
使用此:
int add_all(array, 4);
调用函数时,尝试将数组传递给该数组 将被转换为指向数组第一个元素的指针。
功能原型
int add_all(int[] , int size);
或
int add_all(int* , int size);