TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] 编译器/TM4C129CNCZAD:错误#1836:指示符可能不会指定非 POD 子对象

Guru**** 2046970 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/782890/compiler-tm4c129cnczad-error-1836-designator-may-not-specify-a-non-pod-subobject

器件型号:TM4C129CNCZAD

工具/软件: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
    }; 

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这并不能解释为什么它不像我最初发布它的方式。 它遵循语言标准。 您是否可以针对编译器提交错误? 我们将使用版本18.1.3。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不同意、也不相信它符合 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 类型的非顺序指定初始化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有趣。 这是一种非常微妙的行为、我感谢您的解释。