2012-05-03 17 views
10

Questo è un codice Sto compilando su Linux:Perché C99 si lamenta delle dimensioni dello spazio di archiviazione?

#include <net/if.h> 

int main() { 
    struct ifreq ifr; 
} 

gcc test.c va bene.

gcc -std=gnu99 test.c va bene.

gcc -std=c99 test.c non riesce con il seguente errore:

test.c: In function ‘main’: 
test.c:4:16: error: storage size of ‘ifr’ isn’t known 

Cosa c'è di diverso C99 che non gli piace la definizione di struct ifreq in Linux?

+0

Credo che la mia domanda sia un duplicato di questo: http://stackoverflow.com/questions/3875197/std-c99-wtf-on-linux –

risposta

16

È una catena di conseguenze della preelaborazione e GNU C vs C99.

primo, net/if.h:

  1. net/if.h include features.h
  2. Successivamente, esso definisce struct ifreq in un blocco #ifdef __USE_MISC.

Quindi:

  1. Che cosa è __USE_MISC? - Sono cose comuni a BSD e System V
  2. È definito a questo punto? - Abbiamo bisogno di verificare che in features.h

Così ora, features.h:

  1. Quando si utilizza --std=c99 GCC per default definisce __STRICT_ANSI__ (dal momento che questo è ciò che è C99)
  2. Mentre pre-elaborazione features.h, quando __STRICT_ANSI__ è attivo, le funzioni BSD e System V non entrano in funzione. Ad esempio, __USE_MISC non viene definito.

Indietro fino a net/if.h: struct ifreq non esiste nemmeno dopo la pre-elaborazione! Pertanto, il reclamo sulla dimensione di archiviazione.

Potete prendere tutta la storia facendo:

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

o diff'ing in altro modo (come diff --side-by-side) invece di vimdiff.

+0

Grazie per la spiegazione. Ho appena inciampato nello stesso identico problema. C'è un modo per compilare con successo tale codice con '--std = c99'? – michas

+0

@michas Sì. È possibile definire la '_BSD_SOURCE' o la' _SVID_SOURCE' [macro test funzionale] (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html) nei sorgenti C. – ArjunShankar

Problemi correlati