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

San*_*osh 50 c struct initialization member

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

例:

struct s {
   int i = 10;
};
Run Code Online (Sandbox Code Playgroud)

Ale*_*x B 38

如果要在声明中初始化非静态成员:struct

在C++(而不是C)中,structs几乎与类同义,并且可以在构造函数中初始化成员.

struct s {
    int i;

    s(): i(10)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

如果要初始化实例:

在C或C++中:

struct s {
    int i;
};

...

struct s s_instance = { 10 };
Run Code Online (Sandbox Code Playgroud)

C99还有一个称为指定初始化器的功能:

struct s {
    int i;
};

...

struct s s_instance = {
    .i = 10,
};
Run Code Online (Sandbox Code Playgroud)

还有一个GNU C扩展,它与C99指定的初始化器非常相似,但最好使用更便携的东西:

struct s s_instance = {
    i: 10,
};
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 34

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

struct s { int i=10; };
Run Code Online (Sandbox Code Playgroud)

这不会声明任何变量 - 它定义了一个类型.要声明一个变量,你可以在}和之间添加一个名称;,然后你会在之后初始化它:

struct s { int i; } t = { 10 };
Run Code Online (Sandbox Code Playgroud)

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

struct s { int i; } t = { .i = 10 };
Run Code Online (Sandbox Code Playgroud)

此表示法还可用于初始化联合,以选择初始化联合的哪个元素.


小智 13

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

struct s {
   int i = 10;
};
Run Code Online (Sandbox Code Playgroud)

这是一个古老的问题,但它在谷歌中排名靠前,并且可能会澄清.


Mot*_*tti 8

编辑:这个问题最初被标记了,c++但是海报说它是关于c所以我重新标记了这个问题,我现在离开了答案......

在C++中,a 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?" };
Run Code Online (Sandbox Code Playgroud)