12

私のコンパイラ(gcc)は、次の宣言行に警告(エラーではありません!)をスローしますfp

int fd = open("filename.dat", O_RDONLY);
FILE* fp = fdopen(fd, "r"); // get a file pointer fp from the file descriptor fd

これらは警告です:

main.c: In function ‘main’:
main.c:606: warning: implicit declaration of function ‘fdopen’
main.c:606: warning: initialization makes pointer from integer without a cast

fopenの戻り値が であるため、これらの警告がわかりませんFILE*。ここで私が犯している間違いは何ですか?

編集:私は含めていますstdio.h(そして私もLinuxを使用しています)。

4

5 に答える 5

15

短い答え:-std=gnu99コンパイル時に使用します。通常の標準は非 POSIX であり、fdopen.


warning: implicit declaration of function ‘fdopen’

の宣言が存在するヘッダーファイルを含めるのを忘れたことを意味しますfdopen()。その後、コンパイラによる暗黙の宣言が発生します-つまり、未知の関数の戻り値が想定されることを意味しますint-したがって、2番目の警告。あなたは書く必要があります

#include <stdio.h>

編集: stdio.h を適切に含めると、fdopen()対象のシステムで使用できない場合があります。Windows を使用していますか? この関数は POSIX 専用です。

編集 2: 申し訳ありませんが、私は本当にこれを認識する必要がありました。C99 は ANSI C99 標準を意味します。標準 C は、非 POSIX システムをサポートするためにファイル記述子の概念を強制しないため、提供fopen()のみを行います。fdopen()ファイル記述子に関連しているため、POSIX のみであり、標準 C99 の一部ではありません。GCCにスイッチを使用する-std=gnu99と、標準の制限が取り除かれ、POSIXおよびGNUのみの拡張機能が許可され、本質的に問題が修正されます.

于 2012-09-02T12:57:32.507 に答える
2
#define _XOPEN_SOURCE 600
#include <stdio.h>

これは厳密な c99 に完全に準拠しています

gcc -std=c99 -pedantic -Wall -Wextra -Werror
于 2013-09-03T18:52:27.033 に答える
1

C に含まれていない#include <stdio.h>ため、コンパイラは呼び出しようとしている関数の宣言を「推測」します。(ベースにしたパラメーターを取得し、戻り値として int を使用します)。通常、そのような推測は必要ないため、コンパイラは警告します。

解決策: 適切な を追加します#include

于 2012-09-02T12:58:54.520 に答える
0

@ H2CO3の回答にコンパイラの診断に関する良い説明があるので、理由だけを見てみましょう.

特に、次の行を追加する必要がある場合があります。

#define _POSIX_SOURCE
// or #define _XOPEN_SOURCE

#include <stdio.h>

特定のコンパイラ (gcc など) には、同じ効果を持つコマンド ライン オプションもあります ( gnu*gcc のすべての標準オプション)。

于 2012-09-02T14:12:21.280 に答える
0

関数は C 標準のfdopen一部ではなく、標準 C モードでコンパイルする場合、標準ヘッダーの一部として使用できません。したがって、ソースをコンパイルする-std=gnu99代わりに使用するか、関数を自分で宣言する必要があります。-std=c99

于 2012-09-02T13:11:36.530 に答える