初始化C:初始值设定项元素中的结构不是常量
我读过关于这个话题的其他答案,但它们对我没有帮助。 我试图初始化结构,但在C中出现以下错误msgs: 错误:初始值设定项元素不是常量 错误:(接近“resource01.resource.role”的初始化) 对于Url来说,它是有效的,只是角色不起作用。如果我将角色定义为char,我没有任何问题。我做错了什么初始化C:初始值设定项元素中的结构不是常量,c,struct,initialization,C,Struct,Initialization,我读过关于这个话题的其他答案,但它们对我没有帮助。 我试图初始化结构,但在C中出现以下错误msgs: 错误:初始值设定项元素不是常量 错误:(接近“resource01.resource.role”的初始化) 对于Url来说,它是有效的,只是角色不起作用。如果我将角色定义为char,我没有任何问题。我做错了什么 static char const resource01Url[] = "/dummy"; static int const resource01Role = 2; static str
static char const resource01Url[] = "/dummy";
static int const resource01Role = 2;
static struct RestResourceNode_S resource01 =
{
{
resource01Url,
resource01Role,
&DummyHandler_call
},
NULL
};
static struct RestResourcesManager_S resourcesManager =
{
&resource01, &resource01
};
定义了RestResourceNode_S类型:
struct RestResourceNode_S
{
RestResource_T resource;
struct RestResourceNode_S const *next;
}
和再资源:
struct RestResource_S
{
char const *url;
int const *role;
retcode_t (*handle)(Msg_T *);
};
typedef struct RestResource_S RestResource_T;
该错误表示您正在使用非常量表达式初始化结构成员 表达式为
resource01Role
虽然它被声明为static
和const
,但从C编译器的角度来看,它不是一个初始值设定项常量表达式。如果希望以这种方式使用它,则必须将其定义为预处理器宏。在您的情况下,const
仅向编译器指出resource01Role
的值不会更改-它不允许它在编译期间使用该值
然而,正如@WhozCraig所指出的,角色的类型实际上是int const*
,因此您可能打算编写&resource01Role
。的地址是一个常量表达式,因此可以编译
由于
resource01Url
是一个数组,编译器会隐式应用操作符&
的地址,因此它是常量。首先,为int const*
成员分配一个值,该值为int const
。将role
更改为int const
或将初始值设定项更改为&resource01Role
,那么DummyHandler\u调用的函数原型是什么样子的?虚拟函数不与资源一起工作。。。我认为错误并不存在……那么我认为@WhozCraig指出的错误是唯一的一个。是的,那就是错误:D你能解释一下为什么是那样吗?谢谢你的回答。你能告诉我为什么它对url有效而对角色无效吗?我现在如何访问变量role的值?@user3464679编辑了答案,解释char[]得到一个隐式的&。我不确定我是否理解您的第二个问题-resource01.resource.role
将为您提供指针和它所指向的值。