【问题标题】:Embedded C++ static initialization of struct arrays结构数组的嵌入式 C++ 静态初始化
【发布时间】:2019-10-25 13:27:05
【问题描述】:

在迁移到 C++ 时,我需要某个似乎已被弃用的函数。
sorry, unimplemented: non-trivial designated initializers not supported

在 C++ 中为内存约束系统实现以下数据存储系统的正确方法是什么?

typedef union union_t {
    float f;
    int i;
} arg;

typedef struct type_t {
    int a;
    arg b;
    int d;
} element;

const element list[] = {
    {
      .a = 1,
      .b = { .f = 3.141519f },
      .d = 6
    },
    {
      .a = 3,
      .b = { .i = 1 },
    }
};

通常建议使用std:map 或std:vector。这是合适的,但是list 是不可变的,并且必须能够编译和链接到特定的闪存块。两者似乎都不适合这个目的。

我能达到的最高版本是 ARM Compiler 6,也就是 C++14。

【问题讨论】:

  • 这是 C++20 中的一个新特性,它没有被“弃用”(这意味着一个旧特性将被删除)
  • 现在,您需要使用标准 C 才能使用指定的初始化程序。此外,在任何一种语言中创建“变体”类型联合都是一个非常糟糕的主意。我想不出你为什么会在 C++ 中使用union。
  • 不,std::map 和 std::vector 不适合,因为这是嵌入式系统,而不是 PC。使用 std::array 或 POD 类型。 “...编译并链接到特定的闪存块。两者似乎都不适合该目的。”整个 C++ 语言都不适合这个目的。

标签: c++ struct embedded designated-initializer initializing


【解决方案1】:

您显示的方式几乎正确,符合传入的 C++20 标准。只有.d 也必须被初始化。是我建议使用的吗?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf

要在 C++14 中处理这个问题,你必须明确地初始化它:

typedef union union_t {
    float f;
    int i;
} arg;

typedef struct type_t {
    int a;
    arg b;
    int d;
} element;

const element list[] = {
    {
      /*.a = */ 1,
      /*.b = */ { /*.f = */ 3.141519f },
      /*.d = */ 6
    },
    {
      /* .a = */ 3,
      /* .b = */ { /* .i = */ 1 },
      0
    }
};

【讨论】:

  • 我没有找到显式初始化.d 的要求(参见第一个示例)。 d 将被初始化为 {} 如果缺失。
  • 不幸的是 ARM Compiler 6 不支持 C++14 以上的版本
  • 在您的示例中,如何指定正在初始化的联合字段?
  • 编译器会做,你的任务是提供正确的类型
  • @majkrzak “不正确类型”的警告不会消失,是吗? (顺便说一句,C++ 错误)
猜你喜欢
  • 2023-04-05
  • 2011-02-08
  • 1970-01-01
  • 2014-10-07
  • 2021-01-31
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
相关资源
最近更新 更多