web-dev-qa-db-fra.com

structures en C avec valeurs initiales

Je veux créer une structure en C avec des valeurs initiales comme:

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

Je sais que ce qui précède n'est pas possible, existe-t-il une autre façon de procéder?

37
Layla

vous ne pouvez pas le faire de cette façon

Utilisez plutôt ce qui suit

typedef struct
{
   int id;
   char* name;
}employee;

employee emp = {
.id = 0, 
.name = "none"
};

Vous pouvez utiliser une macro pour définir et initialiser vos instances. cela vous facilitera la tâche à chaque fois que vous souhaitez définir une nouvelle instance et l'initialiser.

typedef struct
{
   int id;
   char* name;
}employee;

#define INIT_EMPLOYEE(X) employee X = {.id = 0, .name ="none"}

et dans votre code lorsque vous devez définir une nouvelle instance avec le type d'employé, vous appelez simplement cette macro comme:

INIT_EMPLOYEE(emp);
42
MOHAMED

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, ce n'est pas possible en C.

23
Alok Save

Tu peux faire:

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

typedef struct employee_s employee;

Et puis il vous suffit de vous rappeler de faire l'initialisation par défaut lorsque vous déclarez une nouvelle variable employé:

employee foo = employee_default;

Alternativement, vous pouvez simplement toujours créer votre structure d'employé via une fonction d'usine.

13
Donnie

Si vous utilisez gcc, vous pouvez donner designated initializers dans la création d'objet.

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

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

Ou, utilisez simplement l'initialisation du tableau comme.

employee e = {0 , "none"};

7
Omkant

Plus encore, pour ajouter aux réponses existantes, vous pouvez utiliser une macro qui cache un initialiseur de structure:

#define DEFAULT_EMPLOYEE { 0, "none" }

Puis dans votre code:

employee john = DEFAULT_EMPLOYEE;
3
Bogdan Alexandru

Vous pouvez implémenter une fonction d'initialisation:

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

Vous pouvez utiliser une combinaison de fonctions de préprocesseur C avec varargs , littéraux composés et initialiseurs désignés pour une commodité maximale:

typedef struct {
    int id;
    char* name;
} employee;

#define EMPLOYEE(...) ((employee) { .id = 0, .name = "none", ##__VA_ARGS__ })

employee john = EMPLOYEE(.name="John");  // no id initialization
employee jane = EMPLOYEE(.id=5);         // no name initialization
2
Maxim Kulkin

Vous pouvez lui créer une fonction:

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

Si vous n'utilisez cette structure que pour ne fois, c'est-à-dire pour créer une variable globale/statique, vous pouvez supprimer typedef et initialiser cette variable instantanément:

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

Ensuite, vous pouvez utiliser employee dans votre code après cela.

0
HaxtraZ