2017-03-12 13 views
5

ファイルに「hello」と書いているだけの機能を作っています。私はそれを別のファイルに入れて、そのヘッダをプログラムに入れました。しかしgccはエラーを出しています:エラー:不明な型名 'FILE'。 コードがエラー:不明なタイプ名 'FILE'

app.c下に与えられる:gccでコンパイル時、次が発生

void write_hello(FILE* fp){ 
    fprintf(fp,"hello"); 
    printf("Done\n"); 
} 

:write_hello.h

#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; 
} 

void write_hello(FILE*); 

をwrite_hello.cを:

[email protected]:~/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){ 
       ^

ご迷惑をおかけして申し訳ありません。私は初心者です。

+7

'の#include 'もwrite_hello.c'から。 'FILE'は' stdio.h 'で定義されています。 –

答えて

4

FILEはstdio.hで定義されており、それを使用する各ファイルに含める必要があります。したがって、write_hello.hとwrite_hello.cの両方にインクルードする必要があります。また、write_hello.cにはwrite_hello.hも含める必要があります(write_hello.hで定義されている関数が実装されているため)。

また、すべてのヘッダーファイルで同じ名前のマクロ(IN CAPS)を定義し、ヘッダー全体を#ifndef、#endifの間に囲むことは標準的な方法です。 Cでは、ヘッダが#includedになるのを防ぎます。これは「内部のガード」と呼ばれています(Story Tellerに感謝します)。

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"); 
} 
+1

あなたが探している用語は "内部のガード" – StoryTeller

+0

私はそれをありがとう、ありがとうございます。しかし、何度も何度もstdio.hを使用することは、stdio.hが複数回含まれることを意味するのでしょうか?また、stdio.hにも "内部インクルードガード"があります。お気軽に –

+1

@HarshDave、はい、stdio.hにすべての標準インクルードファイルと同様に、内部インクルードガードヘッダーを初めて含めると、ガードが定義され、その内容が含まれます。 2回目はガードがすでに定義されているので#ifndefはfalseで、ヘッダ全体がスキップされます。これは、gccのコンパイラがそれを見る前に、Cのプリプロセッサcppによって行われます。したがって、stdio.hはコンパイル単位ごとに1回しか含まれません。 – ScottK

関連する問題