2015-07-01 2 views
8

Цель состоит в том, чтобы передать постоянный массив, (представляющий переменные члены соответствующего параметра структуры), как {{"network", "lan"}, {"dhcp", "true"}} в качестве параметра при вызове функции, как:Как передать литерал массив в качестве входного аргумента функции?

ubus_call("router", "client", {{"network", "lan"}, {"dhcp", "true"}}, 2); 

Я попытался следующий код, но он возвращает ошибки в сборник:

struct ubus_args { 
char *key; 
char *val; 
}; 

int ubus_call(char *obj, char *method, struct ubus_args u_args[], int size_args) { 
printf("%s\n", obj); 
printf("%s\n", method); 
printf("%s %s\n", u_args->key, u_args->val); 
return 0; 
} 

int main() 
{ 
    ubus_call("router", "client", {{"network", "lan"}, {"dhcp", "true"}}, 2); 
    return 0; 
} 

Как я могу это сделать надлежащим образом?

+0

сложные литералы, может быть? –

+0

", но он возвращает ошибки в компиляции:" -> опубликует сообщение об ошибке. – chux

+1

Шаг 1, используйте 'int ubus_call (const char * obj, const char * method, const struct ubus_args * u_args, size_t size_args) ' – chux

ответ

7

Если вы используете компилятор C99 и выше, вы можете использовать compound literals, чтобы выполнить свою работу.

Вы можете переписать вызов функции, как

ubus_call("router", "client", (struct ubus_args[]){{"network", "lan"}, {"dhcp", "true"}}, 2); 

и он будет работать.

LIVE DEMO

BTW, рекомендуемая подпись main() является int main(void).

9

Вот полная программа, вы можете попробовать.

#include <stdio.h> 

struct ubus_args { 
    char *key; 
    char *val; 
}; 

int ubus_call(char *obj, char *method, struct ubus_args u_args[], int size_args) { 
    printf("%s\n", obj); 
    printf("%s\n", method); 
    printf("%s %s\n", u_args[0].key, u_args[0].val); 
    printf("%s %s\n", u_args[1].key, u_args[1].val); 
    return 0; 
} 

int main() 
{ 
    ubus_call("router", "client", (struct ubus_args[2]){{"network", "lan"}, {"dhcp", "true"}}, 2); 
    return 0; 
} 

Программа протестирована на GNU GCC v4.8.3 онлайн компилятор.

+2

Если для 'ubus_call' не требуется изменять строки, используйте' const struct ubus_args' как в параметре функции, так и в составном литерале –