我有以下代码:
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将编译正常。这是怎么回事?
答案 0 :(得分:2)
它不是复合文字特有的东西。结构const
成员只能初始化,一旦定义了对象就无法修改。
struct test t;
// from now on, t.i cannot be modified
t.i = 42; // invalid