2
votes

struct Employé {} comparer struct {} Employé

J'ai lu un tutoriel dans lequel il y a cette structure:

struct EmployeeType
{
    char Name[25];
    int Age;
    float SkillRating; 
};

définit un nouvel agrégat, appelé Employee, contenant des champs appelés Name (de type caractère), Age (de type integer) et SkillRating (de type float).

En revanche, l'instruction C:

struct
{
    char Name[25];
    int Age;
    float SkillRating;
} Employee;

ne définit pas de nouvelle variable d'agrégation, mais définit un nouveau type d'agrégat, Type d'employé. Ce nouveau type de données pourrait ensuite être utilisé pour déclarer des variables dans le de la même manière qu'un type de données primitif. Autrement dit, de la même manière que C permet le variable x à déclarer comme un entier à l'aide de l'instruction

Je suis confus ici. La distinction existe-t-elle si vous placez «Employé» sur une position différente?

Je suppose qu'ils sont identiques.


3 commentaires

"La distinction existe-t-elle si l'on place« l'employé »à un poste différent?" Oui. Et vous pouvez également placer à la fois EmployeeType et Employee dans une seule instruction qui combinera simplement les deux significations.


La syntaxe struct est encore un autre échec du langage en C. Elle est tout simplement incohérente et s'ouvre à différents styles. Je vous conseillerais de faire ceci: si vous avez besoin d'un type struct, utilisez typedef struct {...} type; Si vous avez besoin d'une variable struct, utilisez type name; . Dans les rares cas où vous avez besoin d'une structure auto-référencée (comme un nœud de liste chaînée), faites ceci: typedef struct tag {... struct tag * next; } type; . Et c'est tout.


@Alice. J'ai eu le même problème dans le passé et le pire reste à venir lorsque typedef sera utilisé avec struct. Vous verrez une syntaxe comme typedef struct X {...} X; ou typedef struct {...} X, typedef struct X X, ... . Je vous suggère donc de lire ces articles stackoverflow.com/q/1675351/7462275 et stackoverflow.com/q/252780/7462275


3 Réponses :


3
votes
int func(int a, struct A_s { int memb; } b);
struct A_s { int memb; } func(int a);
struct B_s {
    int memb1;
    struct A_s {
         int memb2;
    } a;
};

0 commentaires

4
votes

Dans le premier cas, la struct est sans nom et Employee est une variable de cette structure sans nom. Vous pouvez le modifier directement comme ceci:

int main()
{
    Employee.Age = 100;
    struct EmployeeType a;  // employee on the stack
    a.Age = 100;
    return 0;
}

Dans le second cas, EmployeeType n'est qu'un type, mais vous n'en avez pas encore créé d'instance. Vous pouvez créer n'importe quel nombre d'instances:

struct EmployeeType
{
    char Name[25];
    int
        Age;
    float SkillRating;
} Employee;

Vous pouvez même faire les deux à la fois:

int main()
{
    struct EmployeeType a;  // employee on the stack
    a.Age = 100;
    struct EmployeeType *b = malloc(sizeof(struct EmployeeType)); // employee on the heap
    if (b) { // set the age of b if the allocation succeeded
        b->Age = 100;
    }
    free(b); // malloc-allocated memory must be freed afterwards 
    return 0;
}

Ici, Employee en est une instance, mais vous pouvez créer des instances supplémentaires:

int main()
{
    Employee.Age = 100;
    return 0;
}


0 commentaires

1
votes

Le mot clé struct en C peut être utilisé pour déclarer des types de données agrégés, des objets de données agrégés ou les deux.

Dans votre première déclaration (et définition), un nom de balise est manquant, donc un objet anonyme «Employé» est créé. «Employee» reste le seul objet de cette structure. Vous ne pouvez pas créer plus d'objets à partir de cette structure ailleurs dans le code.

Dans votre deuxième déclaration, vous avez créé un type de structure qui peut être instancié plusieurs fois (c'est-à-dire que plusieurs instances de cette structure peuvent exister) comme ci-dessous -

struct EmployeeType employee_1;
struct EmployeeType employee_2;

Ces deux syntaxes sont utiles en fonction du cas d'utilisation.


0 commentaires