web-dev-qa-db-ja.com

Cの構造体メンバーのデフォルト値

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

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’
62
user1508893

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

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

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

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

typedef struct MyStruct_s MyStruct;

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

MyStruct mInstance = MyStruct_default;
98
Alok Save

Cで構造を定義するときに初期化できないことにも同意します。しかし、以下に示すインスタンスの作成時に構造を初​​期化できます。

Cでは、

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

c ++では、以下に示す構造の定義に直接的な価値を与えることができます。

struct s {
    int i;

    s(): i(10)
    {
    }
};
15
Chirag Desai

他の回答で言及されているように、デフォルトの構造体を作成します。

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

これがヘッダーファイルに問題がある人の助けになることを願っています。

2
David Callanan

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

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
Adeel Ahmed

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

Mystruct s;
Mystruct_init(&s);

またはさらに短く:

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

デフォルト値への別のアプローチ。構造体と同じ型で初期化関数を作成します。このアプローチは、大きなコードを個別のファイルに分割するときに非常に役立ちます。

struct structType{
  int flag;
};

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


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