web-dev-qa-db-fra.com

valeur par défaut pour le membre struct en C

Est-il possible de définir les valeurs par défaut pour certains membres de la structure?

typedef struct
{
  int flag = 3;
} MyStruct;

Les erreurs:

$ 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’
53
user1508893

La structure est un type de données. Vous ne donnez pas de valeurs à un type de données. Vous donnez des valeurs aux instances/objets de types de données.
Donc non ce n'est pas possible en C. 

À la place, vous pouvez écrire une fonction qui effectue l’initialisation de l’instance de structure.

Alternativement, vous pourriez faire:

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

typedef struct MyStruct_s MyStruct;

Et puis toujours initialiser vos nouvelles instances en tant que:

MyStruct mInstance = MyStruct_default;
90
Alok Save

Je suis d'accord avec Als sur le fait que vous ne pouvez pas initialiser au moment de définir la structure dans C . Mais vous pouvez initialiser la structure au moment de créer l'instance indiquée ci-dessous.

En C,

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

en C++, il est possible de donner une valeur directe à la définition de la structure indiquée ci-dessous

struct s {
    int i;

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

Créez une structure par défaut comme indiqué dans les autres réponses:

struct MyStruct
{
    int flag;
}

MyStruct_default = {3};

Cependant, le code ci-dessus ne fonctionnera pas dans un fichier d'en-tête - vous obtiendrez l'erreur: multiple definition of 'MyStruct_default'. Pour résoudre ce problème, utilisez plutôt extern dans le fichier d'en-tête:

struct MyStruct
{
    int flag;
};

extern const struct MyStruct MyStruct_default;

Et dans le fichier c:

const struct MyStruct MyStruct_default = {3};

J'espère que cela aidera tous ceux qui ont des problèmes avec le fichier d'en-tête.

1
David Callanan

Vous pouvez utiliser une fonction pour initialiser struct comme suit,

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

MODIFIER:

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);
}
1
Adeel Ahmed

Une fonction d'initialisation à une structure est un bon moyen de lui attribuer des valeurs par défaut:

Mystruct s;
Mystruct_init(&s);

Ou même plus court:

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

Une autre approche des valeurs par défaut. Créez une fonction d'initialisation avec le même type que la structure. Cette approche est très utile lorsque vous divisez un gros code en fichiers séparés. 

struct structType{
  int flag;
};

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


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