gpt4 book ai didi

c - 警告 : initializer element is not constant

转载 作者:行者123 更新时间:2023-12-02 07:33:04 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





25: warning: initializer element is not a constant expression [duplicate]

(1 个回答)


7年前关闭。




全部,

我有以下 C 代码,当我编译时,

static struct 
{
const char* val;
const char* parse_key;
int len; //parse key length
void (*parse_routine) (const char* after, rtsp_sdp_t* response);
} sdp_header[] =
{
#define SDP_FILL_STRUCT(a,b) {#a, b, strlen(b), sdp_##a}
SDP_FILL_STRUCT(attr_control, "a=control:"),
SDP_FILL_STRUCT(attr_framerate,"a=framerate:"),
SDP_FILL_STRUCT(attr_range, "a=range:"),
{'\0', '\0', 0, (void*)0},

};

为什么它会给出以下错误:
:330: warning: initializer element is not constant
:330: warning: (near initialization for 'sdp_header[0]')
:331: warning: initializer element is not constant
:331: warning: (near initialization for 'sdp_header[1]')
:332: warning: initializer element is not constant
:332: warning: (near initialization for 'sdp_header[2]')
:333: warning: initializer element is not constant

不知 Prop 体是什么原因,求大神帮忙看看。谢谢

最佳答案

在 C89/90 中,所有用大括号括起来的初始值设定项都必须是常量。在 C99 和更高版本中,用于具有静态存储持续时间的对象的大括号括起来的初始化程序必须是常量。

这就是您的情况:sdp_header是一个具有静态存储持续时间的数组,这意味着您只能在 {} 之间使用常量。 .

除了 strlen 之外,您的所有初始化程序似乎都是常量。那些。函数调用不会产生常量。在您的具体情况下,您可以替换 strlensizeof

#define SDP_FILL_STRUCT(a,b) {#a, b, sizeof b - 1, sdp_##a}

但只有在 b 时才有效代表文字字符串(在您的示例中就是这种情况)。

此外,您的最后一个初始化程序要么错误,要么具有误导性,具体取决于您的意图。 val 的值是多少?和 parse_key应该在最后一个元素中?如果你想要空字符串,那么它应该是
{ "", "", 0, NULL }

如果你想要空指针,那么它应该是
{ NULL, NULL, 0, NULL }

或者
{ 0, 0, 0, 0 }

甚至仅仅是
{ 0 }

您当前的 '\0'将用作空指针常量,但指定空指针常量是一种误导和奇怪的方式。

以及您为什么要套管 0void *对于函数指针成员也不清楚。为什么?只需写 NULL或普通 0 .无需 Actor 。如果你想要一个 Actor ,至少把它转换成正确的类型。 void * 去哪儿了来自?

关于c - 警告 : initializer element is not constant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19762020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com