¿Por qué C99 se queja de los tamaños de almacenamiento?

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?

preguntado el 03 de mayo de 12 a las 15:05

Creo que mi pregunta es un duplicado de esto: stackoverflow.com/questions/3875197/std-c99-wtf-on-linux -

1 Respuestas

Es una cadena de consecuencias del preprocesamiento y GNU C vs C99.

Por primera vez, net/if.h:

  1. net/if.h incluye features.h
  2. Más adelante se define struct ifreq dentro de una #ifdef __USE_MISC bloquear.

De modo que:

  1. Qué es __USE_MISC? -- es algo común a BSD y System V
  2. ¿Está definido en este punto? - Tenemos que comprobar eso en features.h

Y ahora, features.h:

  1. Cuando se utiliza --std=c99 GCC define por defecto __STRICT_ANSI__ (ya que eso es lo que es C99)
  2. 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 or haz tu propia pregunta.