2012-09-02 24 views
9

私のコンパイラ(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 

は、私はこれらを理解していません戻り値fopenFILE*であるため、警告が表示されます。私がここで作っている間違いは何ですか?

EDIT:私はstdio.hを含んでいます(そして私もLinuxです)。

+3

と完全に準拠して? – robert

+0

@robert:stdio.h、stdlib.h、string.h、errno.h、unistd.h、sys/types.h、sys/stat.h、fcntl.h – pap42

+0

'man fdopen'は、持っていない? – robert

答えて

11

短い答え:コンパイル時に-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-only拡張が問題を本質的に修正します。

+1

申し訳ありませんが、私は** ** ** stdio.hを含んでいることを忘れていました(編集を参照)。 – pap42

+1

@ pap42あなたは窓を使っているかもしれません。それが事実なら、私はあなたに中止してほしいと提案します。 –

+1

私は実際Linux上にいる。 – pap42

2

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

解決策:適切な#includeを追加してください。

+0

申し訳ありませんが、この回答は間違っています。私は 'stdio.h'を含んでいます(編集を参照)。 – pap42

+0

あなたはどのシステムにいますか? - POSIXは 'fdopen()'が 'stdio.h'(またはstdio.hに含まれるヘッダ)になければならないと言っています - http://pubs.opengroup.org/onlinepubs/007908775/xsh/fdopen.html – johannes

+0

I Linux上で(これは 'stdio.h'をインクルードしているので、私はこの警告に悩まされます)。 – pap42

0

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

0

あり、コンパイラの診断@ H2CO3の答えでのための良い説明だので、なぜ物事ののが唯一のに見てみましょう:あなたはglibcのを使っている(とおそらくある)あれば、特定のPOSIX関数は、特定の機能が必要な場合がありますテストマクロが表示されます。特に

、次の行を配置する必要があるかもしれない:(gccなど)

#define _POSIX_SOURCE 
// or #define _XOPEN_SOURCE 

#include <stdio.h> 

前に、特定のコンパイラも同じ効果にコマンドラインオプションを持っている(すべてのgccの標準オプションはgnu*です)。

+1

これは原則的に正しいですが、 '_POSIX_SOURCE'はPOSIX標準の古い90年代のバージョンからのものです。現代の名前は '_POSIX_C_SOURCE'であり、空の定義には定義できません。必要なバージョンに定義する必要があります。 '200809L'は現在の標準の正しい値です。 –

1
#define _XOPEN_SOURCE 600 
#include <stdio.h> 

これは、あなたが `#のinclude`-INGどのようなものがあり、厳密なC99

gcc -std=c99 -pedantic -Wall -Wextra -Werror 
関連する問題