2012-05-03 15 views
10

यह कुछ कोड मैं लिनक्स पर संकलन कर रहा हूँ है।सी 99 स्टोरेज आकारों के बारे में शिकायत क्यों करता है?</p> <pre><code>#include <net/if.h> int main() { struct ifreq ifr; } </code></pre> <p><code>gcc test.c</code> ठीक है:

gcc -std=gnu99 test.c ठीक है।

gcc -std=c99 test.c निम्नलिखित त्रुटि के साथ विफल:

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

क्या C99 के बारे में अलग है कि यह लिनक्स में struct ifreq की परिभाषा पसंद नहीं करता है?

+0

मेरा मानना ​​है कि मेरा प्रश्न इस का एक डुप्लिकेट है: http://stackoverflow.com/questions/3875197/std-c99-wtf-on-linux –

उत्तर

16

यह पूर्व प्रसंस्करण के परिणामों और GNU सी बनाम C99 की एक श्रृंखला है।

सबसे पहले, net/if.h:

  1. net/if.h बाद में features.h
  2. भी शामिल है, यह एक #ifdef __USE_MISC ब्लॉक के अंदर struct ifreq परिभाषित करता है।

तो:

  1. क्या __USE_MISC है? - यह बीएसडी और सिस्टम वी
  2. के लिए सामान्य बात है क्या यह इस बिंदु पर परिभाषित किया गया है? - हम, features.hfeatures.h

तो अब में है कि बाहर की जाँच करने की जरूरत है:

  1. आप --std=c99 जीसीसी डिफ़ॉल्ट रूप से परिभाषित करता है __STRICT_ANSI__
  2. (thats क्या C99 है के बाद से) features.h preprocessing जबकि उपयोग करते हैं, जब __STRICT_ANSI__ चालू है, तो बीएसडी और सिस्टम वी फीचर्स में लात नहीं है। यानी __USE_MISC को अपरिभाषित छोड़ दिया गया है।

net/if.h पर वापस: struct ifreq प्रीप्रोकैसिंग के बाद भी मौजूद नहीं है! इसलिए, स्टोरेज आकार के बारे में शिकायत।

आप ऐसा करके पूरी कहानी पकड़ कर सकते हैं:

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

या उन्हें किसी अन्य तरीके से diff'ing (जैसे diff --side-by-side) vimdiff के बजाय।

+0

स्पष्टीकरण के लिए धन्यवाद। मैं बस एक ही मुद्दे पर ठोकर खाई। क्या इस कोड को सफलतापूर्वक '--std = c99' के साथ संकलित करने का कोई तरीका है? – michas

+0

@ मिचस हां। आप अपने सी स्रोतों में या तो '_BSD_SOURCE' या' _SVID_SOURCE' [फीचर टेस्ट मैक्रो] (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html) को परिभाषित कर सकते हैं। – ArjunShankar