2012-03-22 38 views
2

我不能完全肯定,但這個看上去錯誤:標準輸入輸出包含在頭文件

我有一個名爲fraction.h我在其中存儲的部分結構一個頭文件和方法來處理它,一個方法用於在文件中寫入一個分數,並且在該函數的簽名中,一個參數是一個指針。

fraction.h:

... 
const Fraction * fraction_fwrite(const Fraction * f, FILE * file); 
... 

fraction.c:

#include <stdio.h> 
#include "fraction.h" 
... 

現在,當我嘗試編譯使用一小部分的程序,我得到一個錯誤,

這裏是我在我的Makefile

program_test: fraction.o program_test.o 

,我包括fraction.hprogram_test.c當然。 但我不斷收到此錯誤:

fraction.h:34:54:錯誤:未知類型名稱「文件」

有人可以解釋,通過該編譯器包括文件的不同步驟? ,因爲<stdio.h>fraction.c那麼爲什麼它會觸發這種不適用的錯誤?

應該包括<stdio.h>fraction.h?這從我的微不足道的經驗看來並不合適。

+1

您也必須在程序測試中包含''。 – 2012-03-22 09:51:47

回答

5

stdio.h中當你編譯program_test,編譯器不看對方。c文件,只有您實際編譯的文件中的文件爲#include

因此,您必須在測試程序中使用#include <stdio.h>,就像在fraction.c中一樣,或者將其包含在頭文件中。

即使C標準說標準庫文件不會包含對方,也沒有什麼說用戶定義的文件不能做到這一點。事實上,如果他們使用它們通常會更容易。

+0

感謝您明確指出,您能否提供任何解釋如何從一組源文件構建可執行文件的鏈接?不是我沒有得到你的答案(我做過),但關於你的stackoverflow積分我敢打賭,你有好的地方推薦。 – user544262772 2012-03-22 10:04:23

+0

也許這個? [如何包含頭文件發生](http://stackoverflow.com/questions/705676/how-does-inclusion-of-header-file-happen)或者[包含文件頭/源文件](http: //stackoverflow.com/questions/1603337/included-file-from-header-source-file) – 2012-03-22 10:16:28

1

當預處理器處理文件時,它會將包含文件的內容複製到預處理的文件中。您在fraction.c中沒有得到該錯誤的原因是stdio.h的內容包含在fraction.h之前。

所以處理後的文件fragments.c看起來是這樣的:

stdio.h contents 
    fragment.h contents 
    fragment.c contents 

注意,FILE定義將包括通過stdio.h它在fragment.h引用之前。

你應該在fraction.h中包含stdio.h以擺脫這個錯誤。

0

在program_test.c中包含stdio.h。如果你不在program_test.c中包含stdio.h(包括fraction.h),編譯器不知道fraction.h使用的FILE的定義,併產生錯誤。

而且,你真的應該包括在fraction.h