C中struct成员的默认值

use*_*893 66 c struct

是否可以为某些结构成员设置默认值?我尝试了以下但是,它会导致语法错误:

typedef struct
{
  int flag = 3;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

错误:

$ gcc -o testIt test.c 
test.c:7: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token
test.c: In function ‘main’:
test.c:17: error: ‘struct <anonymous>’ has no member named ‘flag’
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 104

结构是一种数据类型.您不为数据类型赋值.您为数据类型的实例/对象赋值.
所以在C中不可能做到这一点.

相反,您可以编写一个函数来执行结构实例的初始化.

或者,您可以这样做:

struct MyStruct_s 
{
    int id;
} MyStruct_default = {3};

typedef struct MyStruct_s MyStruct;
Run Code Online (Sandbox Code Playgroud)

然后始终将新实例初始化为:

MyStruct mInstance = MyStruct_default;
Run Code Online (Sandbox Code Playgroud)

  • MyStruct_default应声明为const. (7认同)
  • 如果我有一个全局数组:'MyStruct arr[MAX_SIXE];',该函数如何使用?(注意:我不能有一个 init() 函数可以遍历所有成员并设置标志) (3认同)

Chi*_*sai 16

我同意Als在C中定义结构时无法初始化.但是您可以在创建实例时初始化结构,如下所示.

在C中,

 struct s {
        int i;
        int j;
    };

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

在C++中,它可以直接赋予结构定义,如下所示

struct s {
    int i;

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


Dav*_*nan 8

正如其他答案所提到的那样,创建一个默认结构:

struct MyStruct
{
    int flag;
}

MyStruct_default = {3};
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码在头文件中不起作用 - 你会得到错误:multiple definition of 'MyStruct_default'. 要解决此问题,请extern在头文件中使用:

struct MyStruct
{
    int flag;
};

extern const struct MyStruct MyStruct_default;
Run Code Online (Sandbox Code Playgroud)

c文件中:

const struct MyStruct MyStruct_default = {3};
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助任何在头文件方面遇到问题的人。


Bog*_*dru 5

更重要的是,要添加现有答案,您可以使用隐藏结构初始值设定项的宏:

#define DEFAULT_EMPLOYEE { 0, "none" }
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

employee john = DEFAULT_EMPLOYEE;
Run Code Online (Sandbox Code Playgroud)