我正试图用作为函数参数传递的值初始化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
)初始化struct
(char *text
)的非const
成员。
要解决此问题,请从参数的定义中删除const
,或者将struct
的成员定义为const
。