14

これは私がLinuxでコンパイルしているコードです:

#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

struct ifreqLinuxでの定義が気に入らないC99の違いは何ですか?

4

1 に答える 1

22

これは、前処理とGNUCとC99の結果の連鎖です。

まず、net/if.h

  1. net/if.h含むfeatures.h
  2. 後で、ブロックstruct ifreq内で定義します。#ifdef __USE_MISC

それで:

  1. __USE_MISCですか?--BSDとSystemVに共通するものです
  2. この時点で定義されていますか?-でチェックアウトする必要がありますfeatures.h

だから今、features.h

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

バックアップnet/if.hstruct ifreq前処理後も存在しません!したがって、ストレージサイズに関する苦情

次のようにして、ストーリー全体を把握できます。

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

または、の代わりに他の方法(などdiff --side-by-side)でそれらを差分しますvimdiff

これをでクリーンにコンパイルする場合は、機能テストマクロ(glibcバージョン> = 2.19の場合。古いバージョンのglibcの場合は、またはのいずれかを使用)-std=c99を含めることを検討して、必要な機能がによって提供されるものに加えて有効になるようにする必要があります。 C99。_DEFAULT_SOURCE_BSD_SOURCE_SVID_SOURCE

于 2012-05-03T16:50:00.287 に答える