Statut de __STDC_IEC_559__ avec les compilateurs C modernes

C99 a ajouté une macro __STDC_IEC_559__ qui peut être utilisée pour vérifier si un compilateur et une bibliothèque de normes sont conformes à la norme ISO / IEC / IEEE 60559 (ou IEEE 754).

Selon les réponses à cette question
How-to-check-that-ieee-754-Représentation simple en 32 bits à virgule flottante La plupart des compilateurs C ne définissent pas la macro de préprocesseur __STDC_IEC_559__ .

Selon la documentation de GCC, il ne définit pas __STDC_IEC_559__ .

J’ai testé cela avec GCC 4.9.2 et Clang 3.6.0 en utilisant avec glibc 2.21 en utilisant le code suivant.

 //test.c //#include  int main(void) { #if defined ( __STDC_IEC_559__ ) //#if defined ( __GCC_IEC_559__ ) return 1; #else return 0; #endif } 

et alors

 echo $? 

Cela montre qu’avec ce code, __STDC_IEC_559__ est défini avec GCC mais pas avec Clang. J’ai ensuite fait gcc -E et cela montrait que le fichier stdc-predef.h était inclus. Ce fichier définit __STDC_IEC_559__ .

 /* glibc's intent is to support the IEC 559 math functionality, real and complex. If the GCC (4.9 and later) predefined macros specifying comstackr intent are available, use them to determine whether the overall intent is to support these features; otherwise, presume an older comstackr has intent to support these features and define these macros by default. */ #ifdef __GCC_IEC_559 # if __GCC_IEC_559 > 0 # define __STDC_IEC_559__ 1 # endif #else # define __STDC_IEC_559__ 1 #endif 

Cela confirme que c’est la glibc qui définit cette macro et non pas GCC.

Cependant, lorsque __STDC_IEC_559__ features.h (ou stdio.h ), ce fichier est également inclus par Clang et __STDC_IEC_559__ est défini.

Donc, __STDC_IEC_559__ est défini à la fois par GCC et Clang (avec un fichier d’en-tête glibc ), ce qui semble être en désaccord avec la réponse à la première question à laquelle je suis lié.

J’ai ensuite testé musl (par exemple, musl-gcc -test.c ), qui est une bibliothèque standard différente de celle de la glibc . Cela a montré que __STDC_IEC_559__ n’est pas défini avec musl .

Si j’ai bien compris, la bibliothèque C standard ne définit pas l’algèbre de base en virgule flottante. Par exemple, la bibliothèque C standard ne définit pas le résultat 1.0/-0.0 . Ceci est défini par le compilateur.

Mes questions sont (classées par ordre d’importance pour moi):

  1. Pourquoi __STDC_IEC_559__ est- __STDC_IEC_559__ défini par la glibc et non par le compilateur?
  2. Si je construisais ma propre bibliothèque standard et que je voulais définir __STDC_IEC_559__ je devrais savoir que le compilateur est déjà conforme à IEEE 754 pour les opérations non définies dans ma bibliothèque standard (par exemple 1.0/-0.0 ). Existe-t-il des documentations pour ceci ou une macro pour tester cela?
  3. Wikipedia indique que “les utilisateurs doivent savoir que cette macro ( __STDC_IEC_559__ ) est parfois définie alors qu’elle ne devrait pas l’être”. Cette déclaration est-elle toujours exacte?

  1. Je crois que __STDC_IEC_559__ repose sur certaines fonctionnalités de la bibliothèque et ne peut pas être défini uniquement par le compilateur. Voir ce post pour quelques informations. Ce n’est pas inhabituel pour C – le compilateur et la bibliothèque C doivent parfois coopérer pour mettre en œuvre l’ensemble de la norme.

  2. Ce que vous demandez dépend du compilateur. Je pense que vous devriez avoir une connaissance particulière du compilateur pour pouvoir décider cela. Dans le cas spécifique de GCC, il définit une macro à vous dire. Recherchez dans ce noeud du manuel __GCC_IEC_559 .

  3. Eh bien … je ne connais pas la réponse à cette question :-). Le message original semble indiquer que, oui, GCC pourrait définir __GCC_IEC_559 s’il a l’ intention de mettre en œuvre IEEE 754, même s’il ne le fait pas.