在C中初始化结构:初始化元素不是常量

时间:2014-04-11 10:12:20

标签: c struct initialization

我已经阅读了关于这个主题的其他答案,但他们没有帮助我。 我试图初始化一个结构但在C中得到以下错误信息:

错误:初始化元素不是常量

错误:(接近初始化'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;
}

和RestResource_t:

struct RestResource_S
{
    char const *url;

    int const *role;

    retcode_t (*handle)(Msg_T *);
};

typedef struct RestResource_S RestResource_T;

1 个答案:

答案 0 :(得分:1)

错误意味着您正在使用非常量表达式来初始化结构成员。

表达式为resource01Role

虽然它被声明为staticconst,但它不是C编译器视图中的初始化程序常量表达式。如果要以这种方式使用它,则必须将其定义为预处理器宏。在您的情况下,const仅向编译器指出resource01Role的值不会更改 - 它不允许它在编译时使用该值。

但是,正如@WhozCraig指出的那样,角色的类型实际上是int const *,所以你可能想写&resource01Role。 Adress-of 一个常量表达式,因此可以编译。

由于resource01Url是一个数组,因此编译器会隐式应用地址运算符&,因此它是常量。