为什么我们不能在结构中初始化成员?
示例:
struct s {
int i = 10;
};
答案 0 :(得分:38)
如果您要在struct
声明中初始化非静态成员:
在C ++(而不是C)中,structs
几乎与类同义,并且可以在构造函数中初始化成员。
struct s {
int i;
s(): i(10)
{
}
};
如果您要初始化实例:
在C或C ++中:
struct s {
int i;
};
...
struct s s_instance = { 10 };
C99还有一个称为指定初始化器的功能:
struct s {
int i;
};
...
struct s s_instance = {
.i = 10,
};
还有一个GNU C扩展,它与C99指定的初始化器非常相似,但最好使用更便携的东西:
struct s s_instance = {
i: 10,
};
答案 1 :(得分:33)
直接答案是因为结构定义声明了一个类型而不是一个可以初始化的变量。你的例子是:
struct s { int i=10; };
这不会声明任何变量 - 它定义了一个类型。要声明变量,您需要在}
和;
之间添加一个名称,然后您将在之后对其进行初始化:
struct s { int i; } t = { 10 };
正如Checkers所说,在C99中,你也可以使用指定的初始化器(这是一个很好的改进 - 有一天,C将赶上Fortran 66用于数据初始化的其他功能,主要是重复初始化器的可指定数量次)。有了这种简单的结构,就没有任何好处。如果你有一个结构,比如20个成员,并且只需要初始化其中一个(比如因为你有一个标志表明结构的其余部分是或者没有被初始化),它更有用:
struct s { int i; } t = { .i = 10 };
此表示法也可用于初始化联合,选择联合的哪个元素初始化。
答案 2 :(得分:13)
请注意,在C ++ 11中,现在允许以下声明:
struct s {
int i = 10;
};
这是一个老问题,但它在谷歌中排名很高,可能也应该澄清。
答案 3 :(得分:8)
修改:这个问题最初被标记为c++
,但海报上说这是关于c
所以我重新标记了这个问题,但我要留下答案了。
在C ++中,struct
只是class
,默认为public
而不是private
成员和继承。
C ++只允许static const
整数成员内联初始化,其他成员必须在构造函数中初始化,或者struct
是初始化列表中的POD(当声明变量)。
struct bad {
static int answer = 42; // Error! not const
const char* question = "what is life?"; // Error! not const or integral
};
struct good {
static const int answer = 42; // OK
const char* question;
good()
: question("what is life?") // initialization list
{ }
};
struct pod { // plain old data
int answer;
const char* question;
};
pod p = { 42, "what is life?" };
答案 4 :(得分:2)
我们无法初始化,因为当我们声明任何结构而不是我们所做的事情时,只需通知编译器它们的存在,即没有为此分配内存,以及我们是否初始化没有内存的成员。通常情况下,当我们初始化任何依赖于我们声明的变量编译器为该变量分配内存的位置的变量时会发生什么。
int a = 10;
那么保存数据需要什么内存,但是在结构没有内存的情况下,那么就不可能初始化它。
答案 5 :(得分:0)
正如你所说,它只是一个不是变量的成员。声明变量时,编译器还会为可以放置值的变量提供内存空间。在结构成员的情况下,编译器没有为它提供内存空间,因此除非您创建该结构类型的变量,否则不能为结构成员赋值。