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 volatile
ou 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.