[解決済み] GCC がコンパイル時にエラーをスローする: error: unknown type name 'FILE'
質問
以下のような関数を作っています。
"hello"
をファイルに保存します。私はそれを別のファイルに置き、そのヘッダーをプログラムに含めました。しかし、gccは次のようなエラーを出します。
error: unknown type name ‘FILE’.
コードは以下の通りです。
app.c
:
#include <stdio.h>
#include <stdlib.h>
#include "write_hello.h"
int main() {
FILE* fp;
fp = fopen("new_file.txt", "w");
write_hello(fp);
return 0;
}
write_hello.h
:
void write_hello(FILE*);
write_hello.c
:
void write_hello(FILE* fp) {
fprintf(fp, "hello");
printf("Done\n");
}
gccでコンパイルすると、以下のようになります。
harsh@harsh-Inspiron-3558:~/c/bank_management/include/test$ sudo gcc app.c
write_hello.c -o app
write_hello.c:3:18: error: unknown type name ‘FILE’
void write_hello(FILE* fp) {
解決方法は?
FILEはstdio.hで定義されており、それを使用する各ファイルでインクルードする必要があります。したがって、write_hello.h と write_hello.c はともにこれをインクルードしなければなりませんし、 write_hello.c は write_hello.h もインクルードしなければなりません (write_hello.h で定義されている関数を実装しているからです).
また、すべてのヘッダーファイルは、同じ名前のマクロを定義し(大文字)、ヘッダー全体を#ifndefと#endifで囲むことが標準的な慣習であることに注意してください。C言語では、これによってヘッダーが2回#includeされるのを防ぐことができます。これは、"内部インクルードガード "と呼ばれています(ご指摘いただいたStory Teller氏に感謝します)。stdio.hのようなすべてのシステムヘッダは、内部インクルードガードを含んでいます。また、ユーザー定義のヘッダーも、以下の例に示すように、内部インクルードガードを含む必要があります。
write_hello.h
#ifndef WRITE_HELLO_H
#define WRITE_HELLO_H
#include <stdio.h>
void write_hello(FILE*);
#endif
write_hello.c
#include <stdio.h>
#include "write_hello.h"
void write_hello(FILE* fp){
fprintf(fp,"hello");
printf("Done\n");
}
システムファイルをインクルードする場合、ヘッダ名は
<>
's. これにより、コンパイラはこれらのヘッダが、開発環境に応じて中央の場所に保存されているシステムヘッダであることを識別しやすくなります。
独自のカスタムヘッダは、引用符で囲みます。
""
は通常カレント・ディレクトリにありますが、パスを含めるか、コンパイラが検索するディレクトリのリストにそのディレクトリを追加することで、他の場所に配置することができます。NetBeansのようなIDEを使用している場合、または-Iコンパイラー・オプションを使用して直接またはmakeファイルを通してビルドしている場合、これはプロジェクト内で設定可能です。
関連
-
[解決済み】fatal error: Python.h: そのようなファイルやディレクトリはありません
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットにするルールがありません)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】0LLや0x0ULの意味は何ですか?