default value for struct member in C

是否可以为某个结构成员设置默认值? I tried the following but, it'd cause syntax error:

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’
295760 次浏览

你不能这样做

使用以下代替

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

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

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


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

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

employee e = {0 , "none"};

你可以实现一个初始化功能:

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

你可以这样做:

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


typedef struct employee_s employee;

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

employee foo = employee_default;

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

结构是一个 数据类型。您不给数据类型赋值。您给数据类型的实例/对象赋值。
所以在 C 语言中这是不可能的。

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

或者,你可以这样做:

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


typedef struct MyStruct_s MyStruct;

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

MyStruct mInstance = MyStruct_default;

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

C 调,

struct s {
int i;
int j;
};


struct s s_instance = { 10, 20 };

in C++ its possible to give direct value in definition of structure shown as below

struct s {
int i;
s(): i(10) {}
};

You can use some function to initialize struct as follows,

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

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

Mystruct s;
Mystruct_init(&s);

或者更短:

Mystruct s = Mystruct_init();  // this time init returns a struct

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

#define DEFAULT_EMPLOYEE { 0, "none" }

然后在你的代码中:

employee john = DEFAULT_EMPLOYEE;

您可以使用 带变量的预处理器函数复合文字指定的初始化程序的组合,以获得最大的方便:

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

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

struct structType{
int flag;
};


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




int main(){
struct structType MyStruct = InitializeMyStruct();
};

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

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";
}

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

struct MyStruct
{
int flag;
}


MyStruct_default = {3};

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

struct MyStruct
{
int flag;
};


extern const struct MyStruct MyStruct_default;

And in the c file:

const struct MyStruct MyStruct_default = {3};

希望这可以帮助任何人与头文件有麻烦。

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

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

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

如果 struct 允许的话,另一种方法是使用带有默认值的 # Definition:

#define MYSTRUCT_INIT { 0, 0, true }


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

用途:

MyStruct val = MYSTRUCT_INIT;

我觉得你可以这么做,

typedef struct
{
int flag : 3;
} MyStruct;