使用const字段为复合文本指定复合文字

时间:2014-09-28 10:00:43

标签: c c99 compound-literals

我有以下代码:

test.c的

struct test {
    int const i;
};

void init_test(struct test *t)
{
    *t = (struct test){42};
}

int main(int argc, char **argv)
{
    (void)argc; (void)argv;

    struct test t;
    init_test(&t);
    /* I would expect t={42} here */
}

使用gcc -std=c99 -Wall test.c -o test进行编译失败,并显示以下错误:

error: assignment of read-only location '*t"
    *t = (struct test){42}
     ^

clang -std=c99 -Wall test.c -o test进行编译成功,而生成的可执行文件按预期运行。首先,我的示例代码是否格式正确?由于函数init_test采用指向非const struct test的指针,我不确定为什么GCC认为我试图修改只读变量。在我看来,我只是按位向{stack}变量struct test分配一个类型为t的文字,并且结构的一个字段标记为const似乎无关紧要。当const被删除时,GCC将编译正常。这是怎么回事?

1 个答案:

答案 0 :(得分:2)

它不是复合文字特有的东西。结构const成员只能初始化,一旦定义了对象就无法修改。

struct test t;

// from now on, t.i cannot be modified
t.i = 42;  // invalid