我想在C中创建一个结构,其初始值如下:
typedef struct {
int id = 0;
char *name = "none";
} employee;
我知道以上是不可能的,还有其他办法吗?
答案 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 varargs,compound literals和designated 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
。