C - 初始化后填充结构 - 编译错误

时间:2014-09-23 13:37:07

标签: c gcc compilation compiler-errors c99

我试图了解以下编译错误背后的原因(使用gcc)。

0. struct mystruct {
1.     int x;
2.     int y;
3. };
4. 
5. int foo() {
6.     struct mystruct m = {1};    // compiles successfully
7.     m = {2,3};                  // compilation error: expected expression before ‘{’ token
8.     return m.x + m.y;
9. }

但是,如果我在第7行显式转换值,代码将编译:

5. int foo() {
6.     struct mystruct m = {1};    // compiles successfully
7.     m = (struct mystruct){2,3}; // compiles successfully
8.     return m.x + m.y;
9. }

我试图理解这个错误背后的原因。 第6行成功编译而不会引发错误 - 编译器在没有显式转换的情况下自动计算出m的类型。为什么它不会在第7行中做同样的事情?

由于

3 个答案:

答案 0 :(得分:4)

原因是C90语法只允许使用复合初始值设定项

换句话说,=右侧的支撑物是初始化表达式,它不是 struct类型的文字

C99添加了compound literals,使其有效。

答案 1 :(得分:3)

在C中,符号=用于赋值和初始化。前者期望在右侧有一个表达式,这是一个括号括起来的初始化列表不是。

在你的第二个例子中,你并没有处理一个演员,而是一个复合文字,一个C99的加法。从语义上讲,它相当于

struct mystruct tmp = {2,3}; // initialization
m = tmp; // assignment

答案 2 :(得分:0)

您的第7行(第一个块)是C99中的无效语法。作业右侧需要一个表达式,而{2,3} 不是一个有效的表达式。

您的第6行(第一个块)是定义中的初始化。