2012-05-03 13 views
10

Bu benim Linux üzerinde derleme bazı kodudur.C99 neden depolama boyutlarından şikayet ediyor?</p> <pre><code>#include <net/if.h> int main() { struct ifreq ifr; } </code></pre> <p><code>gcc test.c</code> gayet:

gcc -std=gnu99 test.c iyi.

gcc -std=c99 test.c

aşağıdaki hata nedeniyle başarısız: Bu Linux struct ifreq tanımını sevmediğini C99 hakkında farklı nedir

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

?

+0

Sorunun bir kopyası olduğuna inanıyorum: http://stackoverflow.com/questions/3875197/std-c99-wtf-on-linux –

cevap

16

Bu, ön işleme ve GNU C ile C99 arasındaki bir sonuç zinciridir.

İlk olarak, net/if.h:

  1. net/if.h Daha sonra
  2. features.h içerir, bu #ifdef __USE_MISC bloğunun içinde struct ifreq tanımlar.

Yani:

__USE_MISC nedir
  1. ? - BSD ve System V
  2. için ortak olan şeyler bu noktada tanımlanmış mı? - Biz features.h,

Şimdi features.h yılında bir kontrol etmek gerekir:

  1. Eğer features.h ön işleme sırasında varsayılan olarak --std=c99 GCC
  2. (ne C99 thats beri) __STRICT_ANSI__ tanımlar kullandığınızda, __STRICT_ANSI__ açık olduğunda, BSD ve System V özellikleri tekme atlamaz. Yani __USE_MISC tanımsız bırakılır.

Ön işleme sonrasında bile net/if.h: struct ifreq bulunmaz! Bu nedenle, depolama alanıyla ilgili şikayet.

Sen yaparak tüm hikayeyi yakalayabilirsiniz:

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

veya başka bir şekilde bunları diff'ing (diff --side-by-side gibi) yerine vimdiff arasında.

+0

Açıklama için teşekkürler. Ben sadece aynı konuda tökezledim. Bu kodu '--std = c99' ile başarıyla derlemek için bir yol var mı? – michas

+0

@michas Evet. C kaynaklarınızdaki '_BSD_SOURCE' veya' _SVID_SOURCE' [özellik sınama makrosu] (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html) tanımlayabilirsiniz. – ArjunShankar