C中struct成员的默认值

时间:2012-12-05 05:32:59

标签: c struct

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

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’

8 个答案:

答案 0 :(得分:93)

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

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

或者,您可以这样做:

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

typedef struct MyStruct_s MyStruct;

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

MyStruct mInstance = MyStruct_default;

答案 1 :(得分:14)

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

在C中,

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

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

struct s {
    int i;

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

答案 2 :(得分:1)

您可以使用某些函数初始化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);
}

答案 3 :(得分:1)

按照其他答案提到的那样创建默认结构:

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

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

答案 4 :(得分:0)

struct的初始化函数是授予它默认值的好方法:

Mystruct s;
Mystruct_init(&s);

甚至更短:

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

答案 5 :(得分:0)

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

struct structType{
  int flag;
};

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


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

答案 6 :(得分:0)

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

#define MYSTRUCT_INIT { 0, 0, true }

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

使用:

MyStruct val = MYSTRUCT_INIT;

答案 7 :(得分:-4)

我认为您可以通过以下方式实现

typedef struct
{
  int flag : 3;
} MyStruct;