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

时间:2011-02-04 17:05:07

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

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

7 个答案:

答案 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 ++ - 版本)