为什么指定的初始化器没有用g ++实现

Bha*_*rat 13 c c++ linux gcc designated-initializer

是否有任何具体原因为什么没有将指定的初始值设定项添加到g ++?是因为C99标准迟到了,而g ++是早期开发的,之后人们不关心这个问题,或者在C++语法中实现指定的初始化器存在一些固有的困难?

Ani*_*dal 12

我今天遇到了同样的问题.g ++与-std = c ++ 11和c ++ 14确实支持指定的初始值设定项,但你仍然可以得到一个编译错误"test.cxx:78:9:抱歉,未实现:不支持非平凡的指定初始值设定项"如果你不要按照定义成员的顺序初始化结构.举个例子

struct x
{
    int a;
    int b;
};

// This is correct
struct x x_1 = {.a = 1, .b = 2};
// This will fail to compile with error non-trivial designated initializer
struct x x_2 = {.b = 1, .a = 2};
Run Code Online (Sandbox Code Playgroud)


Mai*_*ter 9

C++不支持这一点.它似乎甚至不会出现在C++ 0x标准中:http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli = 1

另外,为什么要尝试用G ++编译Linux内核?

  • 等到Linus听到了. (12认同)
  • 我们用C++重写了Linux内核的一部分,所以我们使用g ++是必不可少的 (3认同)

Tom*_*Tom 9

正如我在评论中指出的那样,G ++不支持C99标准指定的初始化程序,但它确实支持允许指定初始化程序的C90的GNU扩展.所以这不起作用:

union value_t {
    char * v_cp;
    float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Run Code Online (Sandbox Code Playgroud)

但这样做:

union value_t my_val = { v_f: 3.5f };
Run Code Online (Sandbox Code Playgroud)

这似乎是C和C++标准委员会之间协调的不良互动(没有特别好的理由说明为什么C++不支持C99语法,他们只是没有考虑过它)和GCC政治(C++不应该' t支持C99语法只是因为它在C99中,但它应该支持GNU扩展语法,它实现了完全相同的东西,因为这是一个可以应用于任何一种语言的GNU扩展.

  • 这在 g++-5.2 中不再正确,并且可能至少可以追溯到 g++-4.8 (2认同)
  • 是的,对不起,这是给读者的一个注释而不是纠正本身. (2认同)