para - Estado de__STDC_IEC_559__ con compiladores C modernos
lenguaje c ejemplos (1)
Creo que
__STDC_IEC_559__
basa en algunas características de la biblioteca y no puede ser definido únicamente por el compilador. Vea esta publicación para alguna información. Esto no es infrecuente para C: el compilador y la biblioteca C a veces deben cooperar para implementar todo el estándar.Lo que pides depende del compilador. Creo que tendrías que tener un conocimiento especial del compilador para decidir esto. En el caso específico de GCC, define una macro para indicarle. Busque en este nodo del manual para
__GCC_IEC_559
.Bueno ... no sé la respuesta a esta :-). La publicación original parece indicar que, sí, GCC podría definir
__GCC_IEC_559
si pretende implementar IEEE 754, incluso si en realidad no lo hace.
C99 agregó una macro __STDC_IEC_559__
que puede usarse para probar si un compilador y una biblioteca estándar cumplen con el estándar ISO / IEC / IEEE 60559 (o IEEE 754).
Según las respuestas a esta pregunta.
how-to-check-that-ieee-754-single-precision-32-bit-floating-point-representation mayoría de los compiladores de C no __STDC_IEC_559__
macro del preprocesador __STDC_IEC_559__
.
De acuerdo con la documentación de GCC, no define __STDC_IEC_559__
.
Probé esto con GCC 4.9.2 y Clang 3.6.0, ambos usando con glibc
2.21 usando el siguiente código.
//test.c
//#include <features.h>
int main(void) {
#if defined ( __STDC_IEC_559__ )
//#if defined ( __GCC_IEC_559__ )
return 1;
#else
return 0;
#endif
}
y entonces
echo $?
Esto muestra que con este código __STDC_IEC_559__
se define con GCC pero no con Clang. Luego hice gcc -E
y se mostró que el archivo stdc-predef.h
está incluido. Este archivo define __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
Esto confirma que es glibc
que define esta macro y no GCC.
Sin embargo, cuando incluyo features.h
(o stdio.h
) este archivo también está incluido en Clang y ese __STDC_IEC_559__
está definido.
Así que __STDC_IEC_559__
está definido por GCC y Clang (con un archivo de encabezado glibc
) que parece estar en desacuerdo con la respuesta a la primera pregunta a la que me vinculé.
Luego probé musl
(por ejemplo, musl-gcc -test.c
) que es una biblioteca estándar diferente a glibc
. Esto mostró que __STDC_IEC_559__
no está definido con musl
.
Como lo entiendo, la biblioteca estándar de C no define el álgebra básica de punto flotante. Por ejemplo, la biblioteca estándar de C no define el resultado de 1.0/-0.0
. Esto es definido por el compilador.
Mis preguntas son (ordenadas en orden de importancia para mí):
- ¿Por qué
__STDC_IEC_559__
está definido porglibc
y no por el compilador? - Si hiciera mi propia biblioteca estándar y quisiera definir
__STDC_IEC_559__
necesitaría saber que el compilador ya cumple con IEEE 754 para operaciones no definidas en mi biblioteca estándar (por ejemplo,1.0/-0.0
). ¿Hay documentaciones para esto o una macro para probar esto? - Wikipedia indica que "los usuarios deben saber que esta macro (
__STDC_IEC_559__
) a veces se define mientras que no debería estar". ¿Es esta declaración todavía precisa?