是否有任何具体原因为什么没有将对指定初始化程序的支持添加到 g++ 中?是因为C99标准来得晚,g++开发得早,后来人们不关心这个问题,还是在C++的语法中实现指定初始化器有一些内在的困难?
7 回答
我今天遇到了同样的问题。带有 -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};
正如我在评论中指出的,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 扩展)。
C++ 不支持这一点。它甚至不会出现在 C++0x 标准中:http ://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1
另外,您为什么要尝试使用 G++ 编译 Linux 内核?
它在 C++20 中得到正式支持,并且已经在 g++8.2 中实现(即使没有std=c++2a
标志)。
至少从 g++-4.8 开始,现在默认支持此功能。
匿名工会呢?
在 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 中如此有价值的功能这一事实是相当遗憾的。
根据 http://gcc.gnu.org/c99status.html 指定的初始化器已经实现。
你用的是什么版本的g++?(尝试 g++ -- 版本)