2

私が書いているいくつかの C コードで奇妙な問題が発生しています。次のコードを検討してください。

#include <sys/stat.h>
ino_t inode;

POSIX.1-2008によると、ヘッダー ファイル<sys/stat.h > はino_t1を定義します。

<sys/stat.h>ヘッダーは、<sys/types.h>で説明されているように、、 、 、、、 、およびblkcnt_tタイプを定義する必要があります。blksize_tdev_tino_tmode_tnlink_tuid_tgid_toff_ttime_t

これは、Linux システムでファイルtest.c内の場所の上のソース コードをコンパイルしようとすると発生します。

$ cat test.c
#include <sys/stat.h>
ino_t inode;
$ uname -srm
Linux 3.8.0-26-generic x86_64
$ lsb_release -d
説明: Ubuntu 13.04
$ gcc -c test.c
$ gcc -std=c90 test.c
test.c:2:1: エラー: 不明な型名 'ino_t'
$ gcc -std=c99 test.c     
test.c:2:1: エラー: 不明な型名 'ino_t'
$ gcc -std=c1x test.c
test.c:2:1: エラー: 不明な型名 'ino_t'

-stdオプションino_tを指定すると not reveleadの定義が表示されるのはなぜですか?

4

2 に答える 2

4

の私のマニュアルページにfstatは、 も含めるように書かれsys/types.hており、それで問題は解決しました。ino_tinの定義は、機能マクロおよびsys/stat.hで保護されています。の定義はそのように保護されていません。__USE_XOPEN__USE_XOPEN2Ksys/types.h

マニュアルページにも を含めるように書かれていますunistd.hが、それは問題を解決するために必要ではありませんでした。

のマニュアルページによるとfeature_test_macros

__STRICT_ANSI__ ISO 標準 C。このマクロは、たとえば-std=c99or-ansiフラグで呼び出されると、gcc(1) によって暗黙的に定義されます。

これは、XOPEN 機能もオフになっていることを意味していると思います。しかし、それについての説明は見つかりませんでした。

PS R.. (下記参照) のマニュアル ページにも記載されているように感じますがfeature_test_macros、私の限られた頭脳では正確な文言を見つけることができないため、それは読者の演習として残しておきたいと思います。それがどこかに記載されていれば、実際にそのマニュアルページに記載されていると思います。

この回答の要点は次のとおりです。

マニュアル ページに記載されているすべてのインクルード ファイルをインクルードし、不要なファイルをリバース エンジニアリングしようとしないでください。

于 2013-08-17T20:16:07.160 に答える