2012-05-03 23 views
10

Esto es código que estoy compilar en Linux:¿Por qué C99 se queja por los tamaños de almacenamiento?

#include <net/if.h> 

int main() { 
    struct ifreq ifr; 
} 

gcc test.c está muy 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 

Lo que es diferente acerca de C99 que no le gusta la definición de struct ifreq en Linux?

+0

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

Respuesta

16

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

En primer lugar, net/if.h:

  1. net/if.h incluye features.h
  2. Más tarde, se define dentro de un bloque struct ifreq#ifdef __USE_MISC.

Así:

  1. ¿Cuál es __USE_MISC? - es algo común a BSD y Sistema V
  2. ¿Está definido en este punto? - Tenemos que comprobar que en features.h

Así que ahora, features.h:

  1. Cuando se utiliza --std=c99 GCC por omisión define __STRICT_ANSI__ (ya que eso es lo que es C99)
  2. durante el preprocesamiento de features.h, cuando __STRICT_ANSI__ está activado, las características BSD y System V no entran en acción. Por ejemplo, __USE_MISC queda sin definir.

Copia de seguridad hasta net/if.h: struct ifreq ¡ni siquiera existe después del preprocesamiento! Por lo tanto, la queja sobre el tamaño de almacenamiento.

Usted puede coger toda la historia haciendo:

vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD) 

o diff'ing ellos de cualquier otra manera (como diff --side-by-side) en lugar de vimdiff.

+0

Gracias por la explicación. Me tropecé con exactamente el mismo problema. ¿Hay alguna forma de compilar con éxito este código con '--std = c99'? – michas

+0

@michas Sí. Puede definir ya sea '_BSD_SOURCE' o' _SVID_SOURCE' [macro de prueba de función] (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html) en sus fuentes C. – ArjunShankar

Cuestiones relacionadas