错误C2088:&x27+=';:visual studio上与c的联合是非法的

错误C2088:&x27+=';:visual studio上与c的联合是非法的,c,structure,union,C,Structure,Union,您好,我收到错误C2088:“+=”:visual studio上的联合错误非法。。。 对于 同样的代码在gcc上正常工作。 您能告诉我用visual studio在c中解决此问题的解决方案吗 typedef union { float sm[8]; } Su; typedef union { Su v; float bm[8]; } Bu; int main() { Bu A1, A2; A2.v.sm[0] = 12.5; // ..

您好,我收到错误C2088:“+=”:visual studio上的联合错误非法。。。 对于 同样的代码在gcc上正常工作。 您能告诉我用visual studio在c中解决此问题的解决方案吗

typedef union {
    float sm[8];
} Su;


typedef union {
    Su v;
    float bm[8];
} Bu;

int main() {
    Bu A1, A2;

    A2.v.sm[0] = 12.5;

    // .... some assignments here 

    A1.v += A2.v;     //      <<<<<<<<<<<< error here

    return 0;
}
typedef联合{
浮动sm[8];
}苏,;
typedef联合{
苏五;
浮动bm[8];
}Bu;
int main(){
bua1,A2;
A2.v.sm[0]=12.5;
//这里有一些作业

A1.v+=A2.v;//的
A1
A2
v
成员是具有单个数组成员的联合类型
sm
,并且未为联合类型定义
+=
。如果要将
A2.v.sm
的值添加到
A1.v.sm
的值中,则需要使用循环:

for ( size_t i = 0; i < 8; i++ )
  A1.v.sm[i] += A2.v.sm[i];
(大小i=0;i<8;i++)的

A1.v.sm[i]+=A2.v.sm[i];
编辑

:

6.5.16.2复合赋值 约束

1对于运算符
+=
-=
,左操作数应为原子、限定或 指向完整对象类型的非限定指针,右侧应为整数类型;或 左操作数应具有原子、限定或非限定算术类型,右操作数应具有原子、限定或非限定算术类型 应具有算术类型。
A1
A2
v
成员是具有单个数组成员的联合类型
sm
,并且未为联合类型定义
+=
。如果要将
A2.v.sm
的值添加到
A1.v.sm
的值中,则需要使用循环:

for ( size_t i = 0; i < 8; i++ )
  A1.v.sm[i] += A2.v.sm[i];
(大小i=0;i<8;i++)的

A1.v.sm[i]+=A2.v.sm[i];
编辑

:

6.5.16.2复合赋值 约束

1对于运算符
+=
-=
,左操作数应为原子、限定或 指向完整对象类型的非限定指针,右侧应为整数类型;或 左操作数应具有原子、限定或非限定算术类型,右操作数应具有原子、限定或非限定算术类型 应具有算术类型。
这不会在gcc上编译,也不应该。同样的代码在linux中的gcc中运行良好…当我将同样的代码移植到windows上有此问题的visual studio时。同样的代码在linux中的gcc中运行良好-。什么是
A1.v+=A2.v;
甚至应该是什么意思?您希望这行代码做什么?投票以“无法复制”结束此操作因为它根本不会在gcc或任何其他C编译器上编译。这不会在gcc上编译,也不应该。同样的代码在linux中的gcc中运行良好…当我将同样的代码移植到windows上的visual studio时,出现了这个问题。同样的代码在linux中的gcc中运行良好-。什么是
A1.v+=A2.v;
甚至应该是什么意思?你希望这一行是什么意思投票关闭它,因为“无法复制”,因为它根本不在gcc或任何其他C编译器上编译。