C中struct成员的默认值


82

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

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’

您可以为该结构创建一个初始化函数。
sgarizvi 2012年

4
不在C中。您可以使函数返回具有所需值的结构。
Vaughn Cato


对于C ++结构,您可以在构造函数中初始化默认数据
Zac

Answers:


122

结构是数据类型。您不给数据类型赋值。您为数据类型的实例/对象提供值。
因此,这在C语言中是不可能的。

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

或者,您可以执行以下操作:

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

typedef struct MyStruct_s MyStruct;

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

MyStruct mInstance = MyStruct_default;

3
如果我有一个全局数组:'MyStruct arr [MAX_SIXE];',该函数如何使用?(请注意:我无法拥有可以通过所有成员并设置标志的init()函数)
user1508893 2012年

10
MyStruct_default应该声明为const。
伦丁

1
感谢您的回答。最终制作了一个代码沙箱以在线对其进行测试,一开始无法连接所有内容,希望这对其他人有所
HoldOffHunger

52

你不能这样

使用以下内容代替

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
如果您想传递给参数而不满足要求,那似乎不太好。

18

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

在C中

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

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

struct s {
    int i;

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

13

你可以做:

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

typedef struct employee_s employee;

然后,您只需要记住在声明新的employee变量时执行默认初始化即可:

employee foo = employee_default;

另外,您也可以始终通过工厂功能来构建您的员工结构。


8

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

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

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

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

employee e = {0 , "none"};


1
我已经看到一些代码还将冒号用于指定的初始化程序,更多有关此问题:stackoverflow.com/questions/1601201/…–
sdaau

7

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

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

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


几年后发表评论:如果可以直接在头文件中执行此操作,则可能更有意义。
David Callanan


3

您可以实现初始化功能:

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

请注意,当在其中定义了C的结构变量对象e所在的块退出时,它们将消失。如果是指针,则将导致悬空指针问题。因此,如果返回类型是指针,则不是一个好的解决方案。最好的方法是使用C结构初始化器创建一个具有默认值的静态全局结构变量对象,并使用set和get函数对该变量进行更改,以在程序运行时更改其值。或将局部结构变量对象作为参数传递给set函数,并在set函数内部更改其属性值。
ecle

2
抱歉,@ ecle就是错的。返回值是裸结构,而不是指针。它将被复制,而不是通过引用返回。老实说,编译器可能会对其进行优化。
bitmask'7

@bismask别误会我..我确实提到了如果该函数是指针,该函数是否返回指针。也许您在我最近的编辑之前已经评论了我的先前评论。
ecle

2

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

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

2
好吧,如果我想拥有一个全局的结构体数组,该如何建议调用GetMyStruct()?
user1508893

GetMyStruct不应该使用malloc吗?
德米特里


1

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

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

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


0

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

Mystruct s;
Mystruct_init(&s);

甚至更短:

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

如果我有一个全局数组:'MyStruct arr [MAX_SIXE];',该函数如何使用?(注意:我不能拥有将通过所有成员并设置标志的init()函数)
user1508893 2012年

0

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

struct structType{
  int flag;
};

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


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

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

0

如果该结构允许,则另一种方法是使用#define并在其中包含默认值:

#define MYSTRUCT_INIT { 0, 0, true }

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

使用:

MyStruct val = MYSTRUCT_INIT;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.