27 votes

Comment ce typedef est-il possible?

En cela DONC, la question que j'ai rencontré un très étrange typedef:

struct Date {
    int day, month, year;
} typedef date_s;

J'ai toujours été voir typedefs suite à cette "règle":

typedef <existing> <new>;

Par exemple:

typedef unsigned long long ull;
typedef int kph; // speed
typedef void (*alpm_cb_log)(alpm_loglevel_t, const char *, va_list);

typedef int int_t;
typedef char char_t, *char_p, (*fp)(void);

La 4e place est prise à partir d' ici, les 5e et 6e sont de cppreference


Et ce est la façon dont je voudrais typedef un struct:

typedef struct {
    int a, b, c;
} data;

// and then use it
data Something;

La question est de savoir comment est-ce même possible d'écrire un tel typedef? Il n'a même pas de sens (au moins pour moi).

clang ne donne pas d'erreurs ou d'avertissements, même avec -Wall -Wextra.

Question Bonus: devrais-je en informer l'auteur de la question " d'où ce code peut être trouvé pour éviter d'utiliser un tel typedef (parce que c'est très inhabituel et peut conduire à la confusion)?

31voto

dasblinkenlight Points 264350

Il s'avère qu' typedef peuvent être placés après le type existant (en plus avant). Cette petite bizarrerie, maintenant obsolètes*, est causée par la façon dont le C standard "bundles" typedefs avec la classe de stockage des prescripteurs, comme static et auto:

Une déclaration est définie comme suit:

<declaration> ::=  {<declaration-specifier>}+ {<init-declarator>}*

Cela signifie que la déclaration des prescripteurs peuvent apparaître dans n'importe quel ordre. Maintenant, déclaration spécificateur est

<declaration-specifier> ::= <storage-class-specifier>
                          | <type-specifier>
                          | <type-qualifier>

Et de stockage de classe spécificateur est

<storage-class-specifier> ::= auto
                        | register
                        | static
                        | extern
                        | typedef

La déclaration de l' structs'éléments est un spécificateur de type. Comme typedef mot-clé, c'est une déclaration spécificateur. Depuis la déclaration de prescripteurs peuvent apparaître dans n'importe quel ordre, à la fois les emplacements de typedef (c'est à dire, avant et après l' struct) sont valides et identiques les uns aux autres.

*N1570, 6.11.5: "Le placement d'une catégorie de stockage spécificateur d'autres qu'au début de la déclaration des prescripteurs dans une déclaration à l'est de la vétusté des fonctionnalité." Merci, Keith Thompson, pour un grand commentaire!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X