57

为什么我们不能在结构中初始化成员?

例子:

struct s {
   int i = 10;
};
4

6 回答 6

40

如果要在声明中初始化非静态成员: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,
};
于 2008-10-22T10:03:43.267 回答
37

直接的答案是因为结构定义声明了一个类型而不是一个可以初始化的变量。你的例子是:

struct s { int i=10; };

这没有声明任何变量——它定义了一个类型。要声明一个变量,您需要在}和之间添加一个名称;,然后再对其进行初始化:

struct s { int i; } t = { 10 };

正如 Checkers 所指出的,在 C99 中,您还可以使用指定的初始化器(这是一个了不起的改进——有一天,C 将赶上 Fortran 66 用于数据初始化的其他功能,主要是重复初始化器指定的次数)。使用这种简单的结构,没有任何好处。如果你有一个结构,比如说,20 个成员并且只需要初始化其中一个(比如说因为你有一个标志,表明结构的其余部分是否已初始化),那么它更有用:

struct s { int i; } t = { .i = 10 };

这个符号也可以用来初始化联合,选择联合的哪个元素被初始化。

于 2008-10-22T15:14:12.797 回答
20

请注意,在 C++ 11 中,现在允许以下声明:

struct s {
   int i = 10;
};

这是一个老问题,但它在谷歌中排名很高,不妨澄清一下。

于 2016-05-31T16:12:45.143 回答
8

Edit2:这个答案写于 2008 年,与 C++98 相关。成员初始化的规则在语言的后续版本中发生了变化。

编辑:这个问题最初是被标记c++的,但发帖人说它是关于c所以我重新标记了这个问题,但我留下了答案......

在 C++ 中,astruct只是一个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?" };
于 2008-10-22T10:05:30.017 回答
2

我们不能初始化,因为当我们声明任何结构而不是我们实际所做的时,只需通知编译器它们的存在,即没有为此分配内存,如果我们初始化没有内存的成员。通常,当我们初始化任何变量时会发生什么,这取决于我们声明变量的位置编译器为该变量分配内存。

int a = 10;
  • 如果它是自动的,而不是在堆栈内存中分配
  • 如果它是全局的,而不是在数据部分内存要分配

所以需要什么内存来保存这些数据,但是在结构的情况下没有内存,所以不可能初始化它。

于 2016-03-14T18:14:19.370 回答
0

正如你所说,它只是一个成员而不是变量。当您声明一个变量时,编译器还将为那些您可以放置​​值的变量提供内存空间。在结构成员 a 的情况下,编译器没有为它提供内存空间,因此除非您创建该结构类型的变量,否则您不能为结构成员分配值。

于 2016-05-31T16:26:06.623 回答