c - 为什么我在 C 中初始化结构时得到 #28 expression must be a constant value?

标签 c struct constants

我正在尝试使用作为函数参数传递的值来初始化 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 字段可能是 Ok 如果您确保该指针指向的内容将保留在结构实例的整个生命周期内有效。

如果您只是 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()

关于c - 为什么我在 C 中初始化结构时得到 #28 expression must be a constant value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29300258/

相关文章:

c - 结构体和符号数组

C++ 结构对齐到 1 字节导致 WinCE 崩溃

c++: 字符串常量的地址

c - 为什么当我想在下面的代码中创建一个新的数据集时,当我使用真正的算法时它会出错

c - 将不透明的结构定义放入单独的头文件中

c++ - 为什么我不能将一个非 const 指针传递给一个以指向 const 的指针作为参数的函数

可绑定(bind)到 DDL 的 C# 全局变量/常量,但名称为 "Nice"

c - 如何判断星号的使用是否与指针相关?

c - C中使用数组进行冒泡排序

c - 如何强制用户输入正整数?