Ma question est simplement la suivante:

Est-ce que «flottant complexe» et «complexe flottant» sont valides C?

Les deux semblent être acceptés sans avertissement par gcc.

c
8
eleanora 16 janv. 2017 à 17:52

2 réponses

Meilleure réponse

complex est une macro de complex.h qui se développe dans le spécificateur de type _Complex. Cela se comporte comme tous les autres spécificateurs de type, par exemple int, bool, double. Pour tous les spécificateurs de type appartenant au même "groupe", vous pouvez les combiner dans différents ordres. Ceci est spécifié par C11 6.7.2, je souligne:

Au moins un spécificateur de type doit être indiqué dans la déclaration spécificateurs dans chaque déclaration , et dans la liste de spécificateurs-qualificatifs dans chaque déclaration struct et nom de type. Chaque liste de spécificateurs de type doit être l'un des multisets suivants (délimités par des virgules, lorsque il y a plus d'un multiset par article); les spécificateurs de type peuvent se produire dans n'importe quel ordre , éventuellement mélangé avec l'autre déclaration prescripteurs.

Suit ensuite une liste de groupes valides de spécificateurs de type, où nous trouvons

  • float _Complex
  • double _Complex

Cela signifie que toute permutation des spécificateurs dans le même groupe est correcte.


Pour prendre un autre exemple, il y a un groupe

  • unsigned long long ou unsigned long long int

Ce qui nous donne les combinaisons possibles suivantes:

unsigned long long x;
long unsigned long y;
long long unsigned z;

Ou

unsigned long long int a;
unsigned long int long b;
unsigned int long long c;
int unsigned long long d;
long unsigned long int e;
long long unsigned int f;
long long int unsigned g;
long unsigned int long h;
...

Tout cela signifie la même chose.

7
Lundin 16 janv. 2017 à 15:09

Oui. En général, l'ordre des "mots typés" au début d'une déclaration n'a pas d'importance:

static const unsigned long int x = 42;

Est le même que

long const int unsigned static x = 42;

Référence: C99, 6.7.2 / 2

[...] les spécificateurs de type peuvent apparaître dans n'importe quel ordre, éventuellement mélangés avec les autres spécificateurs de déclaration.

(float et _Complex sont des spécificateurs de type.)

5
melpomene 16 janv. 2017 à 14:55