Status von __STDC_IEC_559__ mit modernen C-Compilern

C99 hat ein Makro hinzugefügt__STDC_IEC_559__ Mit dieser Funktion können Sie testen, ob ein Compiler und eine Standardbibliothek dem Standard ISO / IEC / IEEE 60559 (oder IEEE 754) entsprechen.

Nach den Antworten auf diese Frage
How-to-Check-That-Iee-754-Single-Precision-32-Bit-Fließkomma-Darstellung Die meisten C-Compiler legen das Präprozessor-Makro nicht fest.__STDC_IEC_559__.

Nach GCC-Dokumentation es definiert nicht__STDC_IEC_559__.

Ich habe dies mit GCC 4.9.2 und Clang 3.6.0 getestet, beide mitglibc 2.21 Verwenden des folgenden Codes.

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

und dan

echo $?

Dies zeigt, dass mit diesem Code__STDC_IEC_559__ wird mit GCC definiert, aber nicht mit Clang. Ich habe danngcc -E und es zeigte, dass die Dateistdc-predef.h ist enthalten. Diese Datei definiert__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 compiler intent are available, use them to determine
   whether the overall intent is to support these features; otherwise,
   presume an older compiler 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

Dies bestätigt, dass es @ iglibc das definiert dieses Makro und nicht GCC.

Allerdings, wenn ichfeatures.h (oderstdio.h) Diese Datei ist auch in Clang enthalten und das__STDC_IEC_559__ ist definiert

So__STDC_IEC_559__ wird sowohl von GCC als auch von Clang definiert (mit einemglibc Header-Datei), die mit der Antwort auf die erste Frage, die ich verlinkt habe, nicht einverstanden zu sein scheint.

Ich habe dann getestetmusl (z.B.musl-gcc -test.c) ist eine andere Standardbibliothek alsglibc. Dies zeigte, dass__STDC_IEC_559__ ist nicht definiert mitmusl.

Wie ich es verstehe, definiert die Standard-C-Bibliothek nicht die grundlegende Gleitkomma-Algebra. Zum Beispiel definiert die Standard-C-Bibliothek nicht das Ergebnis von1.0/-0.0. Dies wird vom Compiler festgelegt.

Meine Fragen sind (in der Reihenfolge ihrer Wichtigkeit für mich):

Warum ist__STDC_IEC_559__ definiert vonglibc und nicht vom Compiler?Wenn ich meine eigene Standardbibliothek erstellt habe und @ definieren woll__STDC_IEC_559__ Ich muss wissen, dass der Compiler für Vorgänge, die nicht in meiner Standardbibliothek definiert sind, bereits IEEE 754-konform ist (z. B.1.0/-0.0). Gibt es dafür Dokumentationen oder ein Makro zum Testen?Wikipedia gibt an, dass "Benutzer sollten beachten, dass dieses Makro __STDC_IEC_559__) wird manchmal so definiert, wie es nicht sein sollte ". Ist diese Aussage noch korrekt?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage