为什么在C中初始化结构时,我得到#28表达式必须是一个常数值



我正试图用作为函数参数传递的值初始化struct,如下所示:

struct my add(uint16_t x, uint16_t y, const char *text, uint8_t b, uint8_t c)
{
    struct my M =
    { x, y, NULL, NULL, text, b, NULL, NULL, c, NULL, NULL};
    array[count] = my;
    count++;
}

然而,在struct初始化的线路上,我得到:

#28 expression must have a constant value

否则我该如何在不出现此错误的情况下实现它?

我看到的最重要的问题是将text指针分配给结构的text指针,这很可能是错误的,因为text字段不是const

从参数中删除const也可能是错误的,如果您确保此指针指向的内容在结构实例的整个生命周期内保持有效,则将其添加到struct字段也可以。

如果你只是memset(&widget, 0, sizeof(widget))1,然后像这个一样初始化每个字段,你想做的是更干净

struct widget instance;
memset(&instance, 0, sizeof(instance));
instance.x    = x;
instance.y    = y;
instance.text = malloc(1 + text_size);
if (instance.text != NULL)
    strcpy(instance.text, text);
instance.text_size = text_size;
instance.text_font = text_font;

然后

widgets[widget_count++] = instance;

部分,不应该进入该功能,该功能应该只是

return instance;

无论您在哪里分配了widgets数组,都可以操作数组和widget_count变量,不要为了能够从另一个函数访问它们而将它们设为全局,如果您必须从另一函数访问它们,则将它们作为参数传递,如果您不得不在另一函数中修改widget_count,则将其地址作为参数传递。

但按照你的方式,上下文并不清楚,所以当代码变得更复杂时,你可能会做非常糟糕的事情。


1您需要包括string.h才能使用memset()strcpy()

我想说编译器抱怨您试图用传入的const值(const char *text)初始化structchar *text)的非const成员。

要解决此问题,请从参数的定义中删除const,或者将struct的成员定义为const

最新更新