如何将字面量数组作为函数的输入参数传递?

11

目标是在调用函数时,将类似 {{"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;
}

我该如何以正确的方式做到这一点?


复合字面量,也许? - Sourav Ghosh
但是它在编译时返回错误:--> 发布错误消息。 - chux - Reinstate Monica
1
步骤1,使用int ubus_call(const char *obj, const char *method, const struct ubus_args *u_args, size_t size_args) - chux - Reinstate Monica
struct ubus_args 本身应该使用 const char * 而不是 char *,因为你正在将字符串字面量放入其中。字符串字面量是不可写的。 - M.M
2个回答

10

这是完整的程序,你可以试一试。

#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 - M.M

8
如果您拥有支持C99及以上版本的编译器,您可以使用 复合字面量 来完成您的工作。
您可以将函数调用重写为
ubus_call("router", "client", (struct ubus_args[]){{"network", "lan"}, {"dhcp", "true"}}, 2);

and it will work.

实时演示

BTW,main()的推荐签名是int main(void)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接