15

是否有任何具体原因为什么没有将对指定初始化程序的支持添加到 g++ 中?是因为C99标准来得晚,g++开发得早,后来人们不关心这个问题,还是在C++的语法中实现指定初始化器有一些内在的困难?

4

7 回答 7

13

我今天遇到了同样的问题。带有 -std=c++11 和 c++14 的 g++ 确实支持指定的初始化程序,但是如果您仍然可以得到编译错误“test.cxx:78:9: sorry, unimplemented: non-trivial specified initializers not supported”不要按照定义其成员的顺序初始化结构。举个例子

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};
于 2016-07-22T12:40:01.317 回答
11

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

union value_t {
    char * v_cp;
    float v_f;
};
union value_t my_val = { .v_f = 3.5f };

但这确实:

union value_t my_val = { v_f: 3.5f };

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

于 2012-01-30T11:06:15.423 回答
9

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

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

于 2011-02-04T17:09:10.473 回答
4

在 C++20 中得到正式支持,并且已经在 g++8.2 中实现(即使没有std=c++2a标志)。

于 2019-03-30T18:30:30.490 回答
2

至少从 g++-4.8 开始,现在默认支持此功能。

于 2016-10-07T20:03:46.547 回答
0

匿名工会呢?

在 CI 中可以有这个:

struct vardir_entry {
    const uint16_t id;
    const uint8_t sub;
    const char *name;
    const uint8_t type;

    const union {   
        struct vardir_lookup lookup;
        struct vardir_min_max_conf minmax;       
    };

    const union {
        const struct vardir_value_target_const const_value;
        const struct vardir_value_target value;
    };
};

并像这样初始化:

static const struct vardir_entry _directory[]{
        { .id = 0xefef, .sub = 0, .name = "test", .type = VAR_UINT32, .minmax = { .min = 0, .max = 1000 }, .value = VARDIR_ENTRY_VALUE(struct obj, &obj, member) }
    };

但是,在 g++ 下,即使使用 c++14,也会出现相同的“抱歉,未实现”错误。当我们至少想用 C++ 测试框架对 C 代码进行单元测试时,我们确实需要能够在 C++ 中定义 C 变量。不支持 C 中如此有价值的功能这一事实是相当遗憾的。

于 2017-12-04T13:04:11.467 回答
-3

根据 http://gcc.gnu.org/c99status.html 指定的初始化器已经实现。

你用的是什么版本的g++?(尝试 g++ -- 版本)

于 2011-02-04T17:11:34.887 回答