46 votes

"Typedef" se situe-t-il entre le type et l'alias conforme à la norme?

Je suis tombé sur un code dans lequel le mot clé typedef situe entre le type et le nom d'alias, comme dans

 int typedef INT;
 

Il compile en gcc et clang ( exemple live ). Je ne suis pas très bon dans la compréhension de Standardese. Ma question est donc la suivante: cette norme est-elle conforme? Puis-je compter sur des compilateurs pour le prendre en charge?

24voto

John Bollinger Points 16563

L' typedef mot-clé est classé comme une classe de stockage spécificateur de C, bien que la norme explicitement remarques que c'est pour des raisons de commodité dans l'expression formelle de la syntaxe du langage. Il s ' ensuit cependant qu' typedef peut apparaître exactement dans les mêmes lieux, les mêmes que tout autre système de stockage de classe spécificateur, comme extern ou static, peuvent apparaître. [C2011, 6.7.1/5]

En fait, la syntaxe qui permet le stockage de classe spécificateurs d'être mélangés avec les spécificateurs de type, le type de qualificatifs, et d'autres "déclaration des spécificateurs" dans les déclarations. [C2011, 6.7/1, 6.7/6]

Donc, oui, c'est valable pour mettre la typedef mot-clé après le nom du type, comme dans votre exemple.

21voto

John Bode Points 33046

TL/DR Version

Oui, int typedef INT est conforme.

James Michener Version

C syntaxe de déclaration (C 2011 en ligne projet):

6.7 Déclarations

La syntaxe

1 declaration
        :
        declaration-specifiers init-declarator-listopt

     ;
        static_assert-declaration
        declaration-specifiers
        :
        storage-class-specifier declaration-specifiersopt
        type-specifier declaration-specifiersopt
...

Cela nous dit que dans une seule déclaration, vous pouvez avoir une séquence d'une ou plusieurs déclaration de prescripteurs, où chaque déclaration spécificateur peut être une classe de stockage spécificateur (type-qualifier declaration-specifiersopt, function-specifier declaration-specifiersopt, alignment-specifier declaration-specifiersopt, auto), un spécificateur de type (extern, static, typedef, etc.), un type de qualificatif (int, float, char, etc.), une fonction spécificateur (const), ou un alignement spécificateur.

L'ordre dans lequel les différents prescripteurs apparaître n'importe pas; restrict peut être écrite comme volatileou inline, etc. En pratique, la plupart des gens mettent la classe de stockage de spécificateur d'abord, puis de toute fonction ou de l'alignement des prescripteurs (si nécessaire), puis n'importe quel type de qualificatifs, puis spécificateurs de type, de sorte static const short int x; est de savoir comment la plupart des gens seraient d'écrire cette déclaration.

Cette syntaxe est ce qui nous permet d'écrire des types comme int static short const x ou int short const static x ou static const short int x, etc.

Notez que, bien que la syntaxe permet arbitraire (et arbitrairement longue) des séquences de spécificateurs de type, il y a une sémantique de la règle qui ne permet qu'un nombre relativement restreint. Vous ne pouvez pas écrire long double, par exemple, ou long long. Seules les séquences suivantes sont autorisées:

Les contraintes

2 Au moins un spécificateur de type doit être indiqué dans la déclaration des prescripteurs dans chaque déclaration, et dans le spécificateur de qualifier liste dans chaque structure de la déclaration et du nom de type. Chaque liste de spécificateurs de type doit être l'une des suivantes multisets (délimité par des virgules, quand il y plus d'un multiset par article); les spécificateurs de type peut se produire dans n'importe quel ordre, éventuellement mélangés avec les autres déclaration des prescripteurs.
- unsigned long int
- short short short short x
- long long long double y
- void
- char
- signed char
- unsigned char
- short, signed short, short int, or signed short int
- unsigned short, or unsigned short int
- int, signed, or signed int
- unsigned, or unsigned int
            long, signed long, long int, or signed long int
- unsigned long, or unsigned long int
- long long, signed long long, long long int, or
- signed long long int
- unsigned long long, or unsigned long long int
- float
- double
- long double
- _Bool
- atomique spécificateur de type
- struct ou union spécificateur
- enum spécificateur
- définition de type de nom

Addendum

Comme Keith points dans le commentaire ci-dessous, une future révision de la langue peut limiter classe de stockage des prescripteurs pour le début de la déclaration, de sorte float _Complex peut ne pas être légal en vertu d'un avenir compilateur.

9voto

Mark B Points 60200

Si vous regardez 7.1 / 1, vous voyez cette grammaire pour decl-specifier: , ce qui montre qu'un mot clé type-specifier et le mot clé typedef tombent au même point dans la grammaire, vous permettant de les échanger comme dans la question (bien que de côté, n'écrivez jamais un code comme celui-ci, ce n'est pas du tout idiomatique).

décl-spécificateur:

 storage-class-specifier

type-specifier

function-specifier

friend

typedef
 

0voto

user3629249 Points 6914

Je compile en utilisant:

gcc -c -Wall -Wextra -pedantic -Wconversion -std = gnu99

En arrière-plan, cela signifie que -Wold-style-declaration est défini.

Ensuite, le compilateur génère le message d'avertissement suivant:

 warning: 'typedef' is not a beginning of declaration [-Wold-style-declaration]
 

sans que ce paramètre soit défini, le compilateur gère la syntaxe sans problème

La syntaxe affichée est donc conforme à la norme, mais peut prêter à confusion pour le lecteur.

-2voto

Vinayagam.D Points 24
 typedef int INT
 

Droit d'utiliser typedef

Où que vous utilisiez INT, il sera remplacé par int type de données

Cet objectif principal est uniquement pour les chaînes de données longues à valeur simple, mais dans ce cas, vous pouvez utiliser normal int lui-même.

Vous pouvez utiliser le débogage à des fins de test que vous pouvez très bien comprendre.

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