This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:TI C/C++编译器
我有以下定义:
const int32_t acceleration_default = 0; const int32_t velocity_default = 0; const uint32_t subroutine_default = 0U; struct MotorCmd{ MotorCmd_cmd; int 位置; int32_t 加速度= acceleration_default; int32_t velocity = veloce_default;uint32_t subroutine;uint32_t subroutine = int32_t subroutine ;int32_t subroutine;int32_t subroutine = integro
然后、我在 C++文件中实例化此结构、如下所示:
MotorCmd motorhome ={ .motor_cmd = motor_CMD_home、 .Position = 0、 .Torque = 0 };
对于`.futt = 0`的行、编译器错误为1836。 如果我注释出一行、一切都很好。 这是错误吗? 我不明白为什么不允许这样做。 据我所知、`0`不是非 POD。
我不确定原因、但如果您按顺序初始化所有结构成员、则它会清理。
MotorCmd motorhome ={ .motor_cmd = motor_CMD_home、 .position = 0、 .加速 度=加速度默认值、 .velocity =速度默认值、 .subroutine = subroutine_default、 .fault = 0 };
谢谢、此致、
乔治
我不同意、也不相信它符合 C++标准。
这个被称为非顺序指定初始化的结构不是 C++标准的一部分。 请参阅: 有关聚合初始化的信息
"注意: C 编程语言支持非顺序指定初始化、嵌套指定初始化、混合指定的初始化程序和常规初始化程序以及指定的数组初始化、但 C++中不允许。"
您的原始示例代码会初始化'moder_cmd'和'position'、这是'MotorCmd'类的第一个和第二个字段。 然后、它初始化"Torcmd"类的第六个字段"Torque (扭矩)"。 由于第三个、第四个和第五个字段也没有初始化、因此它是不按顺序指定的初始化、因此格式不正确。
这解释了当您不初始化"扭矩"时错误消失的原因。 它还解释了为什么 George Mock 注意到、当所有六个字段都初始化时、错误也会消失。
编译器提到非 POD 的原因是因为'MotorCmd'本身不是 POD 类类型。 由于'acceleration'、'verslocity'和'subroutine'字段的默认成员初始化程序,因此会为'MotorCmd'类生成隐式的非普通默认构造函数。 您的类声明在功能上与以下内容相同:
const int32_t acceleration_default = 0; const int32_t velocity_default = 0; const uint32_t subroutine_default = 0U; struct MotorCmd{ MotorCmd_cmd; int 位置; int32_t 加速; int32_t 速度; uint32_t 子例程;uint32_t 子例程; int32_t 扭矩; MotorCmd ():加速(加速度默认值)、 速度(velocity_default)、 子例程(subroutine_default){/* empty */} };
要将类视为 POD 的一个要求是,即使类是隐式定义的,也没有特殊构造函数。 CLANG 同意此评估
如果您使用的是 C++、解决此问题的最佳方法是定义和使用构造函数来初始化'MotorCmd'对象、而不是指定的初始化。 我们的编译器不支持非 POD 类型的非顺序指定初始化。