C中的结构具有初始值

时间:2012-12-04 15:56:59

标签: c struct

我想在C中创建一个结构,其初始值如下:

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

我知道以上是不可能的,还有其他办法吗?

9 个答案:

答案 0 :(得分:41)

你不能这样做

请改用以下内容

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);

答案 1 :(得分:22)

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

答案 2 :(得分:11)

你可以这样做:

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

typedef struct employee_s employee;

然后,您必须记住在声明新员工变量时执行默认初始化:

employee foo = employee_default;

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

答案 3 :(得分:7)

如果您使用gcc,则可以在对象创建中提供designated initializers

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

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

或者,只需使用类似数组初始化。

employee e = {0 , "none"};

答案 4 :(得分:3)

您可以实现初始化功能:

employee init_employee() {
  empolyee const e = {0,"none"};
  return e;
}

答案 5 :(得分:2)

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

#define DEFAULT_EMPLOYEE { 0, "none" }

然后在你的代码中:

employee john = DEFAULT_EMPLOYEE;

答案 6 :(得分:0)

您可以使用C preprocessor functions with varargscompound literalsdesignated initializers的组合,以获得最大的便利:

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

答案 7 :(得分: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";
}

答案 8 :(得分:0)

如果仅将此结构用于一次,即创建一个全局/静态变量,则可以删除typedef,并立即初始化此变量:

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

然后,之后可以在代码中使用employee