¿Por qué C99 se queja de los tamaños de almacenamiento?
Frecuentes
Visto 6,018 veces
14
Este es un código que estoy compilando en Linux:
#include <net/if.h>
int main() {
struct ifreq ifr;
}
gcc test.c
está bien.
gcc -std=gnu99 test.c
está bien.
gcc -std=c99 test.c
falla con el siguiente error:
test.c: In function ‘main’:
test.c:4:16: error: storage size of ‘ifr’ isn’t known
¿Qué tiene de diferente C99 que no le gusta la definición de struct ifreq
en linux?
1 Respuestas
22
Es una cadena de consecuencias del preprocesamiento y GNU C vs C99.
Por primera vez, net/if.h
:
net/if.h
incluyefeatures.h
- Más adelante se define
struct ifreq
dentro de una#ifdef __USE_MISC
bloquear.
De modo que:
- Qué es
__USE_MISC
? -- es algo común a BSD y System V - ¿Está definido en este punto? - Tenemos que comprobar eso en
features.h
Y ahora, features.h
:
- Cuando se utiliza
--std=c99
GCC define por defecto__STRICT_ANSI__
(ya que eso es lo que es C99) - Durante el preprocesamiento
features.h
, Cuando__STRICT_ANSI__
está activado, las características de BSD y System V no se activan.__USE_MISC
se deja sin definir.
Respalda a net/if.h
: struct ifreq
¡ni siquiera existe después del preprocesamiento! Por lo tanto, la queja sobre el tamaño de almacenamiento.
Puedes captar toda la historia haciendo:
vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD)
o diferenciarlos de cualquier otra manera (como diff --side-by-side
) en lugar de vimdiff
.
Si quieres que esto se compile limpiamente con -std=c99
, debe considerar la inclusión de la _DEFAULT_SOURCE
macro de prueba de funciones (para versiones de glibc >= 2.19; para versiones anteriores de glibc, utilice _BSD_SOURCE
or _SVID_SOURCE
) para que la funcionalidad requerida esté habilitada además de lo que ofrece C99.
respondido 22 nov., 18:13
Gracias por la explicación. Acabo de tropezar con exactamente el mismo problema. ¿Hay alguna manera de compilar con éxito dicho código con --std=c99
? - michas
@michas Sí. Podrías definir el _BSD_SOURCE
o _SVID_SOURCE
macro de prueba de características en sus fuentes C. - ArjunShankar
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas linux gcc network-programming c99 gnu99 or haz tu propia pregunta.
Creo que mi pregunta es un duplicado de esto: stackoverflow.com/questions/3875197/std-c99-wtf-on-linux - Jim Hunziker