我试图了解以下编译错误背后的原因(使用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行中做同样的事情?
由于
答案 0 :(得分:4)
答案 1 :(得分:3)
在C中,符号=
用于赋值和初始化。前者期望在右侧有一个表达式,这是一个括号括起来的初始化列表不是。
在你的第二个例子中,你并没有处理一个演员,而是一个复合文字,一个C99的加法。从语义上讲,它相当于
struct mystruct tmp = {2,3}; // initialization
m = tmp; // assignment
答案 2 :(得分:0)
您的第7行(第一个块)是C99中的无效语法。作业右侧需要一个表达式,而{2,3}
不是一个有效的表达式。
您的第6行(第一个块)是定义中的初始化。