1. ホーム
  2. c

[解決済み] GCC がコンパイル時にエラーをスローする: error: unknown type name 'FILE'

2022-02-01 02:23:46

質問

以下のような関数を作っています。 "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ファイルを通してビルドしている場合、これはプロジェクト内で設定可能です。