107

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

typedef struct
{
  int flag = 3;
} MyStruct;

错误:

$ 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’
4

16 回答 16

150

结构是一种数据类型。您不会为数据类型赋值。您为数据类型的实例/对象赋予值。
所以不,这在 C 中是不可能的。

相反,您可以编写一个对结构实例进行初始化的函数。

或者,您可以这样做:

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

typedef struct MyStruct_s MyStruct;

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

MyStruct mInstance = MyStruct_default;
于 2012-12-05T05:36:44.900 回答
59

你不能这样做

改用以下内容

typedef struct
{
   int id;
   char* name;
}employee;

employee emp = {
.id = 0, 
.name = "none"
};

您可以使用宏来定义初始化您的实例。每次您想定义新实例并初始化它时,这将使您更容易。

typedef struct
{
   int id;
   char* name;
}employee;

#define INIT_EMPLOYEE(X) employee X = {.id = 0, .name ="none"}

在您的代码中,当您需要使用员工类型定义新实例时,您只需调用此宏,如下所示:

INIT_EMPLOYEE(emp);
于 2012-12-04T15:58:56.813 回答
18

我同意 Als 的观点,即您不能在 C 中定义结构时进行初始化。但是您可以在创建实例时初始化结构,如下所示。

在 C 中,

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

在 C++ 中,可以在结构定义中给出直接值,如下所示

struct s {
    int i;

    s(): i(10)
    {
    }
};
于 2012-12-05T05:45:20.760 回答
15

你可以做:

struct employee_s {
  int id;
  char* name;
} employee_default = {0, "none"};

typedef struct employee_s employee;

然后你只需要记住在声明一​​个新的员工变量时进行默认初始化:

employee foo = employee_default;

或者,您始终可以通过工厂函数构建您的员工结构。

于 2012-12-04T16:06:08.100 回答
10

如其他答案所述,创建一个默认结构:

struct MyStruct
{
    int flag;
}

MyStruct_default = {3};

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

struct MyStruct
{
    int flag;
};

extern const struct MyStruct MyStruct_default;

c文件中:

const struct MyStruct MyStruct_default = {3};

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

于 2018-06-18T14:45:47.523 回答
8

如果您正在使用gcc,您可以designated initializers创建对象。

typedef struct
{
   int id=0;
   char* name="none";
}employee;

employee e = 
{
 .id = 0;
 .name = "none";
};

或者,简单地使用类似数组初始化。

employee e = {0 , "none"};

于 2012-12-04T15:59:10.977 回答
6

更重要的是,要添加现有答案,您可以使用隐藏结构初始化程序的宏:

#define DEFAULT_EMPLOYEE { 0, "none" }

然后在您的代码中:

employee john = DEFAULT_EMPLOYEE;
于 2014-11-21T09:15:07.130 回答
3

您可以实现初始化功能:

employee init_employee() {
  empolyee const e = {0,"none"};
  return e;
}
于 2012-12-04T16:00:12.553 回答
2

您可以使用一些函数来初始化结构,如下所示,

typedef struct
{
    int flag;
} MyStruct;

MyStruct GetMyStruct(int value)
{
    MyStruct My = {0};
    My.flag = value;
    return My;
}

void main (void)
{
    MyStruct temp;
    temp = GetMyStruct(3);
    printf("%d\n", temp.flag);
}

编辑:

typedef struct
{
    int flag;
} MyStruct;

MyStruct MyData[20];

MyStruct GetMyStruct(int value)
{
    MyStruct My = {0};
    My.flag = value;
    return My;
}

void main (void)
{
    int i;
    for (i = 0; i < 20; i ++)
        MyData[i] = GetMyStruct(3);

    for (i = 0; i < 20; i ++)
        printf("%d\n", MyData[i].flag);
}
于 2012-12-05T05:51:22.787 回答
2

您可以将C 预处理器函数与 varargs复合文字指定的初始化程序结合使用,以获得最大的便利:

typedef struct {
    int id;
    char* name;
} employee;

#define EMPLOYEE(...) ((employee) { .id = 0, .name = "none", ##__VA_ARGS__ })

employee john = EMPLOYEE(.name="John");  // no id initialization
employee jane = EMPLOYEE(.id=5);         // no name initialization
于 2017-11-21T15:32:34.857 回答
1

如果你只使用这个结构一次,即创建一个全局/静态变量,你可以删除typedef,并立即初始化这个变量:

struct {
    int id;
    char *name;
} employee = {
    .id = 0,
    .name = "none"
};

然后,您可以employee在那之后在您的代码中使用。

于 2019-08-11T11:27:32.417 回答
1

如果结构允许,另一种方法是使用带有默认值的#define:

#define MYSTRUCT_INIT { 0, 0, true }

typedef struct
{
    int id;
    int flag;
    bool foo;
} MyStruct;

采用:

MyStruct val = MYSTRUCT_INIT;
于 2019-10-18T08:49:27.313 回答
0

结构的初始化函数是授予其默认值的好方法:

Mystruct s;
Mystruct_init(&s);

甚至更短:

Mystruct s = Mystruct_init();  // this time init returns a struct
于 2012-12-05T06:13:34.247 回答
0

默认值的另一种方法。创建一个与结构相同类型的初始化函数。这种方法在将大代码拆分为单独的文件时非常有用。

struct structType{
  int flag;
};

struct structType InitializeMyStruct(){
    struct structType structInitialized;
    structInitialized.flag = 3;
    return(structInitialized); 
};


int main(){
    struct structType MyStruct = InitializeMyStruct();
};
于 2018-04-09T05:25:57.920 回答
0

您可以为它创建一个函数:

typedef struct {
    int id;
    char name;
} employee;

void set_iv(employee *em);

int main(){
    employee em0; set_iv(&em0);
}

void set_iv(employee *em){
    (*em).id = 0;
    (*em).name = "none";
}
于 2018-05-02T01:43:12.960 回答
-8

我认为您可以通过以下方式做到这一点,

typedef struct
{
  int flag : 3;
} MyStruct;
于 2020-05-20T02:05:47.713 回答