107

一部の構造体メンバーにデフォルト値を設定することは可能ですか? 次のことを試しましたが、構文エラーが発生します。

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’
4

16 に答える 16

150

構造体はデータ型です。データ型に値を与えません。データ型のインスタンス/オブジェクトに値を与えます。
いいえ、これはCでは不可能です。

代わりに、構造体インスタンスの初期化を行う関数を作成できます。

または、次のこともできます。

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

typedef struct MyStruct_s MyStruct;

そして、常に新しいインスタンスを次のように初期化します。

MyStruct mInstance = MyStruct_default;
于 2012-12-05T05:36:44.900 に答える
59

あなたはこのようにすることはできません

代わりに以下を使用してください

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);
于 2012-12-04T15:58:56.813 に答える
18

Cで構造体を定義するときに初期化できないというAlsに同意します。ただし、以下に示すように、インスタンスを作成するときに構造体を初期化できます。

Cでは、

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

C++ では、以下に示す構造体の定義に直接値を与えることができます

struct s {
    int i;

    s(): i(10)
    {
    }
};
于 2012-12-05T05:45:20.760 に答える
15

できるよ:

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

typedef struct employee_s employee;

そして、新しい従業員変数を宣言するときに、デフォルトの初期化を行うことを忘れないでください:

employee foo = employee_default;

または、ファクトリ関数を介して従業員構造体を常に構築することもできます。

于 2012-12-04T16:06:08.100 に答える
8

使用している場合は、オブジェクトの作成gccを行うことができます。designated initializers

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

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

または、単に配列の初期化のように使用します。

employee e = {0 , "none"};

于 2012-12-04T15:59:10.977 に答える
3

初期化関数を実装できます。

employee init_employee() {
  empolyee const e = {0,"none"};
  return e;
}
于 2012-12-04T16:00:12.553 に答える
2

次のように、いくつかの関数を使用して構造体を初期化できます。

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);
}
于 2012-12-05T05:51:22.787 に答える
0

構造体への初期化関数は、デフォルト値を与える良い方法です:

Mystruct s;
Mystruct_init(&s);

またはさらに短い:

Mystruct s = Mystruct_init();  // this time init returns a struct
于 2012-12-05T06:13:34.247 に答える