2012-05-03 18 views
10

これは私がLinux上でコンパイルしていますいくつかのコードです:なぜC99はストレージサイズについて不平を言っていますか?

#include <net/if.h> 

int main() { 
    struct ifreq ifr; 
} 

gcc test.cは大丈夫です。

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 

は、それは、Linuxでstruct ifreqの定義は好きではないことをC99についての異なる何ですか?

+0

私の質問はこれと重複していると思います。 http://stackoverflow.com/questions/3875197/std-c99-wtf-on-linux –

答えて

16

前処理とGNU C対C99の結果の連鎖です。

まずアップ、net/if.h

  1. net/if.hは後でfeatures.h
  2. を含み、それは#ifdef __USE_MISCブロック内struct ifreqを定義します。
  3. だから、

__USE_MISCは何

  1. ? - それはBSDとSystem Vに共通のものです
  2. これはこの時点で定義されていますか? - 私たちはfeatures.h

だから今features.hでそれをチェックアウトする必要があります。

  1. あなたがfeatures.hを前処理しながら、デフォルトで--std=c99 GCCは
  2. (何であるかC99 thatsのため)__STRICT_ANSI__を定義して使用する場合は、 __STRICT_ANSI__がオンの場合、BSDとSystem Vの機能は起動しません。つまり、__USE_MISCは未定義です。

net/if.hに戻る:struct ifreqは前処理後にも存在しません! したがって、保管サイズについての苦情

次の操作を行うことにより、全体的な話をキャッチすることができます:

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

またはその代わりvimdiffの(diff --side-by-sideのような)他の方法でそれらをdiff'ingを。

+0

ありがとうございます。私はちょうど同じ問題をちょうど見つけた。 '--std = c99'でこのようなコードをコンパイルする方法はありますか? – michas

+0

@michasはい。 Cソースに '_BSD_SOURCE'または' _SVID_SOURCE' [機能テストマクロ](http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html)を定義することができます。 – ArjunShankar

関連する問題