使用构造函数初始化列表初始化结构时出现问题

时间:2013-10-01 10:52:27

标签: c++ data-structures compiler-errors initialization arduino

我正在编程Arduino,使用以下代码时遇到问题

struct myStruct {
  char variable1[10];
  char variable2[10];
  char variable3[10];

  // Constructor
  myStruct() : variable1({'\0'}), variable2({'\0'}), variable3({'\0'}) {}
};

因为我收到以下错误:

expected primary-expression before '{' token

有什么问题?我该如何解决?

注意\0用于处理空终止字符串。


BTW :为什么以下代码有效,而上述代码没有?

struct myStruct {
  char variable1[10];
  char variable2[10];
  char variable3[10];
} variable = {{'\0'}, {'\0'}, {'\0'}};;

3 个答案:

答案 0 :(得分:2)

删除parens。仅使用大括号。

即代替

variable1({'\0'})

写这个,

variable1{'\0'}   //removed parens!

如果你这样做,你的代码将如下所示:

myStruct() : variable1{'\0'}, variable2{'\0'}, variable3{'\0'} {}

任何支持C ++ 11的编译器都应该能够编译它。


在C ++ 03中,写下:

myStruct() : variable1(), variable2(), variable3() {}

这应该适用于这种特殊情况。这就是你所拥有的:价值初始化。 C ++ 03并没有给你很多自由。

答案 1 :(得分:0)

假设您只想将成员变量初始化为空(C风格)字符串,请更改:

  // Constructor
  myStruct() : variable1({'\0'}), variable2({'\0'}), variable3({'\0'}) {}

为:

  // Constructor
  myStruct() : variable1(""), variable2(""), variable3("") {}

修改

显然某些版本的gcc会抱怨这种用法(请参阅下面的评论) - 这似乎是由于bug in gcc

答案 2 :(得分:0)

在C ++ 11中,您的代码应该可以工作,尽管它有更多的括号而不是严格必要的。

在任何C ++中,您都可以指定值初始化以对数组进行零初始化:

myStruct() : variable1(), variable2(), variable3() {}

如果你是超偏执的,并且不相信'\0'等于零,那么你必须写入构造函数体中的数组。

  

为什么以下代码有效,而上述代码没有?

因为始终可以在声明中聚合初始化变量。自2011年以来,只有成员初始化者才能做到这一点。