初始化C:初始值设定项元素中的结构不是常量

初始化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

我读过关于这个话题的其他答案,但它们对我没有帮助。 我试图初始化结构,但在C中出现以下错误msgs:

错误:初始值设定项元素不是常量

错误:(接近“resource01.resource.role”的初始化)

对于Url来说,它是有效的,只是角色不起作用。如果我将角色定义为char,我没有任何问题。我做错了什么

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
将为您提供指针和它所指向的值。