2017-03-12 66 views
5

Tôi đang tạo một hàm chỉ ghi "hello" vào một tệp. Tôi đã đặt nó trong một tập tin khác nhau và bao gồm tiêu đề của nó trong program.But gcc là đưa ra một lỗi cụ thể là: lỗi: unknown type name 'FILE'. Mã này được đưa ra dưới đâylỗi: tên loại không xác định ‘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"); 
} 

khi biên soạn bởi gcc sau đây xảy ra :

[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){ 
       ^

Xin lỗi vì bất kỳ sai lầm nào. Tôi là người mới bắt đầu.

+7

'#include ' từ 'write_hello.c' là tốt. 'FILE' được định nghĩa trong' stdio.h'. –

Trả lời

4

TẬP_TIN được định nghĩa trong stdio.h và bạn cần bao gồm nó trong mỗi tệp sử dụng nó. Vì vậy, write_hello.h và write_hello.c cả hai nên bao gồm nó, và write_hello.c cũng nên bao gồm write_hello.h (vì nó thực hiện các chức năng được định nghĩa trong write_hello.h). Cũng cần lưu ý rằng đó là thực hành tiêu chuẩn cho mọi tệp tiêu đề để xác định macro có cùng tên (IN CAPS) và kèm theo toàn bộ tiêu đề giữa #ifndef, #endif. Trong C, điều này ngăn cản một tiêu đề nhận đượC#included hai lần. Điều này được gọi là "bảo vệ bao gồm nội bộ" (nhờ có Người kể chuyện để chỉ ra điều đó).

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

Tôi nghĩ rằng thuật ngữ bạn đang tìm kiếm là "nội bộ bao gồm bảo vệ" – StoryTeller

+0

ok tôi đã nhận nó, cảm ơn. Nhưng một lần nữa và một lần nữa bằng cách sử dụng stdio.h trong nhiều tập tin, nó có nghĩa là stdio.h sẽ bao gồm nhiều hơn một lần hoặc không stdio.h cũng có "bảo vệ bao gồm nội bộ" .Thanks –

+1

@HarshDave, Vâng, stdio.h có một nội bộ bao gồm bảo vệ, cũng như tất cả các tệp tiêu chuẩn bao gồm. Lần đầu tiên bạn bao gồm tiêu đề, nó xác định người bảo vệ và bao gồm nội dung của nó. Lần thứ hai, bảo vệ đã được xác định và do đó #ifndef là sai và toàn bộ tiêu đề bị bỏ qua. Điều này được thực hiện bởi bộ tiền xử lý C, cpp, trước khi trình biên dịch của gcc từng thấy nó. Vì vậy, stdio.h chỉ được bao gồm một lần cho mỗi đơn vị biên dịch. – ScottK

Các vấn đề liên quan