C++相当于指定的初始化器?

Jam*_*der 35 c c++ designated-initializer

最近我一直在研究一些嵌入式设备,我们有一些结构和联合需要在编译时进行初始化,这样我们就可以将某些东西保存在不需要修改的闪存或ROM中,并节省一点闪存或SRAM有点性能成本.目前代码编译为有效的C99,但是如果没有这种调整,它也可以编译为C++代码,并且支持以这种方式编译的东西也会很棒.阻止这种情况的关键之一是我们使用C99指定的初始值设定项,它们在C++的C子集中不起作用.我不是一个C++ buff,所以我想知道在C++兼容的C或者C++中仍然允许在编译时进行初始化以便结构和联合不需要的简单方法.在SRAM中启动程序后初始化.

还有一点需要注意:指定初始化程序使用的一个关键原因是初始化,而不是联盟的第一个成员.此外,坚持使用标准C++或ANSI C是为了保持与其他编译器的兼容性(我知道GNU扩展提供类似指定的初始化器而没有C99).

Ada*_*eld 22

我不确定你能用C++做到这一点.对于需要使用指定初始化程序初始化的东西,可以将它们分别放在.c编译为C99 的文件中,例如:

// In common header file
typedef union my_union
{
    int i;
    float f;
} my_union;

extern const my_union g_var;

// In file compiled as C99
const my_union g_var = { .f = 3.14159f };

// Now any file that #include's the header can access g_var, and it will be
// properly initialized at load time
Run Code Online (Sandbox Code Playgroud)

  • +1钉锤,螺钉螺钉. (5认同)
  • 我已经考虑过了,最终可能会走这条路.不幸的是,我们希望移植到一个平台,它使用C++库来提供外围设备支持.它们提供对在线编译器的访问,但是它们仅限于C++模式(为简单起见).我试过抓住预编译的库并使用本地GCC工具链,但是当链接到GCC和Newlib时,有些符号没有从他们的库中解析(他们使用Keil/ARM的RealView).我可以在本地预编译所有C99代码并在线链接.我只想保持简单:-) (2认同)

How*_*ant 18

基于Shing Yip的答案,并且利用3年的时间,C++ 11现在可以保证编译时初始化:

union Bar
{
    constexpr Bar(int a) : a_(a) {}
    constexpr Bar(float b) : b_(b) {}
    int a_;
    float b_;
};

extern constexpr Bar bar1(1);
extern constexpr Bar bar2(1.234f);
Run Code Online (Sandbox Code Playgroud)

部件:

    .globl  _bar1                   ## @bar1
    .p2align    2
_bar1:
    .long   1                       ## 0x1

    .globl  _bar2                   ## @bar2
    .p2align    2
_bar2:
    .long   1067316150              ## float 1.23399997
Run Code Online (Sandbox Code Playgroud)