加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 这是GCC错误吗?初始化结构与工会

发布时间:2020-12-16 05:39:57 所属栏目:百科 来源:网络整理
导读:我可能已经发现GCC v4.8.2的错误,但是我想在提交之前先检查,因为这可能是我做错了! 以下代码: #include vectorstruct Message{ typedef union { char byte; const char *str; } Parameter; Parameter p1; Parameter p2;};int main(){ std::vectorMessage m
我可能已经发现GCC v4.8.2的错误,但是我想在提交之前先检查,因为这可能是我做错了!

以下代码:

#include <vector>
struct Message
{
  typedef union {
    char byte;
    const char *str;
  } Parameter;

  Parameter p1;
  Parameter p2;
};

int main()
{
  std::vector<Message> messages_;

  messages_.push_back({{ .byte = 'a' }});

  Message message = {{ .byte = 'a' },{ .str = "Hello World" }};
  messages_.push_back(message);

  messages_.push_back({{ .byte = 'a' },{ .str = "Hello World" }});
}

clang -std = c 11 main.cpp编译这个罚款.但是g输出:

main.cpp: In function ‘int main()’:
main.cpp:23:66: internal compiler error: in reshape_init_class,at cp/decl.c:5216
   messages_.push_back({{ .byte = 'a' },{ .str = "Hello World" }});
                                                                  ^
Please submit a full bug report,with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
Preprocessed source stored into /tmp/ccrf5vwr.out file,please attach this to your bugreport.

如果没有人有任何想法,我会将其作为一个错误提交,尽管在我的经验中,程序员的问题几乎从来不是编译器错误,几乎总是自己的错误!

解决方法

正如上面的评论中所回答的:从GCC获得的包含短语内部编译器错误的任何错误消息,请提交完整的错误报告绝对是编译器错误,而不是您自己的错误!在这种情况下,该错误似乎与GCC在C模式下解析{{…}}有关,其中“…”包含指定的初始化程序. @Sam已经将其报告为GCC bug 59832.

但是,正如@Angew指出的那样,

messages_.push_back({{ .byte = 'a' }});

– 无效C.标准C不允许指定的初始化程序;这是C(C11和C14)中没有采用的C99特征.

至于为什么指定的初始化器是有问题的添加到C,请参阅here,其中Doug Gregor询问编译器应如何解释

struct Foo {int x,y; };
void f(Foo);
void f(std::initializer_list<int>);

int main(){
    f({1});
    f({1,2});
    f({1,2,3});
    f({.x=1});
    f({.x=1,2});
    f({.x=1,3});
}

为了记录,GCC 4.8将所有六个作为对f(initializer_list< int>)的调用. Clang 3.5将前三个视为对f(initializer_list< int>)的调用,接下来的两个作为对f(Foo)的调用,最后一个作为不正确的调用.基本上,这是一个非标准的构造:不同的编译器在他们的权利内对待它们不同,而且它们也是这样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读