为什么没有向g ++添加对指定初始值设定项的支持的具体原因?是因为C99标准来得晚,g ++是早期开发的,后来人们不关心这个问题,或者在C ++语法中实现指定的初始化器存在一些固有的困难?
答案 0 :(得分:12)
我今天遇到了同样的问题。 g ++ with -std = c ++ 11和c ++ 14确实支持指定的初始值设定项,但你仍然可以得到编译错误" test.cxx:78:9:抱歉,未实现:不支持非平凡的指定初始值设定项#34;如果您没有按照其成员的定义顺序初始化结构。作为一个例子
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};
答案 1 :(得分:9)
C ++不支持此功能。它似乎不会出现在C ++ 0x标准中:http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1
另外,为什么要尝试用G ++编译Linux内核?
答案 2 :(得分:9)
正如我在评论中指出的那样,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扩展。)
答案 3 :(得分:1)
至少从g ++ - 4.8开始,现在默认支持此功能。
答案 4 :(得分:0)
匿名工会怎么样?
在C中我可以拥有:
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">PPE and Ladders</h3>
</div>
<div class="panel-body">
<div class="control-group">
<label class="control-label col-sm-3">Site Specific PPE:</label>
<div class="col-sm-1">
<input type="checkbox" id="siteSpecificPPE" name="siteSpecificPPE" tabindex=10></input>
</div>
</div>
<div class="control-group">
<label class="control-label col-sm-3">Comments:</label>
<div class="col-sm-9">
<textarea rows="3" class="form-control" id="PPEComments" name="PPEComments" tabindex=10></textarea>
</div>
</div>
<div class="control-group">
<label class="control-label col-sm-3">Ladder ID:</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="laddersID" name="laddersID" tabindex=10></input>
</div>
<label class="control-label col-sm-3">Safety Catches:</label>
<div class="col-sm-1">
<input type="checkbox" id="safetyCatchesWorking" name="safetyCatchesWorking" tabindex=10></input>
</div>
<label class="control-label col-sm-2">Warn. Sign:</label>
<div class="col-sm-1">
<input type="checkbox" id="warningSign" name="warningSign" tabindex=10></input>
</div>
</div>
<div class="control-group">
<label class="control-label col-sm-2">Comments:</label>
<div class="col-sm-10">
<textarea rows="3" class="form-control" id="equipmentComments" name="equipmentComments" tabindex=1></textarea>
</div>
</div>
</div>
<!-- panel-body -->
</div>
<!-- panel panel-primary -->
并初始化为:
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;
};
};
然而,在g ++下,即使使用c ++ 14,这也会产生相同的“抱歉,未实现”错误。当我们至少想要用C ++测试框架对C代码进行单元测试时,我们需要能够在C ++中定义C变量。事实上,C的这种有价值的功能得不到支持是非常遗憾的。
答案 5 :(得分:0)
它将是officially supported in C++20,并且是already implemented in g++8.2(即使没有std=c++2a
标志)。
答案 6 :(得分:-2)
致力于 http://gcc.gnu.org/c99status.html 指定的初始化程序已经实施。
您使用的是什么版本的g ++? (试试g ++ - 版本)