【问题标题】:Why are designated initializers not implemented in g++为什么指定的初始化程序没有在 g++ 中实现
【发布时间】:2011-06-21 12:09:37
【问题描述】:

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

【问题讨论】:

  • @Bharat Singh:在 Linux 内核中使用 C++ 是一个非常非常糟糕的主意。 Linux 缺乏使 C++ 正常工作所需的所有基础设施。 Linus Torvalds 多次详细解释了这一点:kerneltrap.org/node/2067
  • 我们有一个用 C++ 实现的 linux 操作系统,核心内核用 C 语言和一些外部包装函数提供对 OO 外部硬件驱动程序的支持。告诉我是否可以修改 gcc 以支持 C++ 中的指定初始化程序
  • 用 C 编译器编译 C 文件,用 C++ 编译器编译 C++ 文件。指定初始化器在 C 中运行良好,但在 C++ 中无效。
  • 我想知道C++不支持的原因
  • 为什么不直接用 C 编译器编译内核的 C 部分,用 g++ 编译 C++ 部分,然后将结果链接在一起?

标签: c++ c linux gcc designated-initializer


【解决方案1】:

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

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

【讨论】:

  • 我们已经用C++重写了部分linux内核,所以使用g++是必不可少的
  • 等到 Linus 听说。
【解决方案2】:

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

您使用什么版本的 g++? (试试 g++ -- 版本)

【讨论】:

  • 那是 C99,不是 C++。我不认为 g++ 隐式支持每个 C99 功能。
  • 可能你没有使用“C模式”
  • 发帖人想要 C++ 中的 C99 结构,这是完全错误的。
  • 我不想要 C99 结构,我想知道 C++ 不支持它们的原因,如果有一些正当的理由不支持它们,我就没有必要花钱了更改 gcc 的时间。
  • 简单来说,C 和 C++ 是两种不同的语言,具有不同的标准。大多数情况下,C++ 标准包括 C 标准中的所有内容,但指定的初始化程序是 C99 标准中的一件事,而不是任何 C++ 标准。所以 G++ 正确地实现了 C++ 标准,不包括指定的初始化器。
【解决方案3】:

正如我在评论中指出的,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++ 不应该仅仅因为它在 C99 中就支持 C99 语法,但它应该支持实现完全相同的事情的 GNU 扩展语法,因为这是可以应用于任何一种语言的 GNU 扩展)。

【讨论】:

  • 这在 g++-5.2 中不再适用,并且可能至少可以追溯到 g++-4.8
  • 嗯,2012年就给出了答案。
  • 是的,抱歉,这只是给读者的说明,而不是更正本身。
【解决方案4】:

我今天遇到了同样的问题。带有 -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};

【讨论】:

  • 指定初始化器仍然不是标准 C++ 版本的一部分。
  • @Quentin 现已更正。
  • @Qu9entin:指定初始化器是 C++20 的一部分。所以是的,他们终于来了。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    匿名工会呢?

    在 C 中我可以有这个:

    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 中如此有价值的功能这一事实是相当遗憾的。

    【讨论】:

      【解决方案7】:

      它是officially supported in C++20,是already implemented in g++8.2(即使没有std=c++2a 标志)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 2015-02-20
        • 2012-07-28
        • 1970-01-01
        相关资源
        最近更新 更多