.c文件就是C語言系列的源文件,而H文件則是C語言的頭文件,即C系列中存放函數和全局變量的文件,由於C中的函數是被封裝起來的,即沒法看到其代碼。html
子程序不要定義在*.h中。函數定義要放在*.c中,而*.h只作聲明.不然多引用幾回,就會發生函數重複定義的錯誤。*.h只作聲明,編譯後不產生代碼。這樣作目的是爲了實現軟件的模塊化,使軟件結構清晰,並且也便於別人使用你寫的程序。數組
純粹用 C 語言語法的角度,你固然能夠在*.h 中聽任何東西,由於 #include 徹底等價於把*.h 文件 Ctrl-C Ctrl-V 到*.c 中,*.h 中應該都是一些宏定義和變量、函數聲明,告訴別人你的程序「能幹什麼、該怎麼用」。*.c 中是全部變量和函數的定義,告訴計算機你的程序「該怎麼實現」。固然,若是一個*.h 被多個*.c 包含,並且*.h 中有對象(變量或函數)的定義,就會發生重複定義的錯誤了,聲明能夠無窮屢次,定義只能一次。ide
通常來講,一個C文件應該是一個模塊,若是你的程序僅僅有一個模塊(僅僅一個C文件),就能夠不用創建H文件了。不然你的模塊確定不是獨立的,你的模塊裏面的實現要被別的模塊調用。這個時候你最好生成一個頭文件(H文件),在頭文件裏面能夠聲明你的那些函數是公共的。當別的模塊包含你的頭文件後,就可使用你的公共聲明瞭。模塊化
一個C對應一個H,這樣管理起來方便,好比你有一個"my.c",那麼就再添加一個"my.h":函數
1 #ifndef _MY_H 2 #define _MY_H 3 externvoidmy(void); 4 #endif
其實在H文件裏寫函數也無所謂,只是不符合習慣而已。只要按照以上的格式寫,一個H文件添加多少次都無所謂,呵~spa
Come from: http://topic.csdn.net/t/20060429/15/4723725.html .net
簡單的說,其實要理解C文件與H文件有什麼不一樣之處,首先須要弄明白編譯器的工做過程,通常說來編譯器會作如下幾個過程: 代碼規範
1.預處理階段 code
2.詞法與語法分析階段 htm
3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進制碼,生成各個目標文件
4.鏈接階段,將各個目標文件中的各段代碼進行絕對地址定位,生成跟特定平臺相關的可執行文件,固然,最後還能夠用objcopy生成純二進制碼,也就是去掉了文件格式信息。
編譯器在編譯時是以C文件爲單位進行的,也就是說若是你的項目中一個C文件都沒有,那麼你的項目將沒法編譯,鏈接器是以目標文件爲單位,它將一個或多個目標文件進行函數與變量的重定位,生成最終的可執行文件,在PC上的程序開發,通常都有一個main函數,這是各個編譯器的約定,固然,你若是本身寫鏈接器腳本的話,能夠不用main函數做爲程序入口!!!
有了這些基礎知識,再言歸正傳,爲了生成一個最終的可執行文件,就須要一些目標文件,也就是須要C文件,而這些C文件中又須要一個main函數做爲可執行程序的入口,那麼咱們就從一個C文件入手,假定這個C文件內容以下:
#include<stdio.h> #include"mytest.h" int main(int argc,char**argv) { test =25; printf("test.................%d\n",test); }
mytest.h文件的內容:
int test;
//a.h void foo();
1 //a.c 2 #include"a.h"//個人問題出來了:這句話是要,仍是不要? 3 void foo() 4 { 5 return; 6 }
1 //main.c 2 #include"a.h" 3 int main(int argc,char*argv[]) 4 { 5 foo(); 6 return0; 7 }
它的解答以下:
1.不必定。這個例子中顯然是多餘的。可是若是.c中的函數也須要調用同個.c中的其它函數,那麼這個.c每每會include同名的.h,這樣就不須要爲聲明和調用順序而發愁了(C語言要求使用以前必須聲明,而include同名.h通常會放在.c的開頭)。有不少工程甚至把這種寫法約定爲代碼規範,以規範出清晰的代碼來。
2.答:1中已經回答過了。
3.答:不會。問這個問題的人絕對是概念不清,要不就是想混水摸魚。很是討厭的是中國的不少考試出的都是這種爛題,生怕別人有個清楚的概念了,絕對要把考生搞暈。
一般狀況下a.c包含a.h,通常是由於a.h裏面定義了一些a.c裏面使用的一些宏,同時它裏面聲明瞭a.c裏面定義的,一些給a.c以外的.c文件用的函數,這樣的話其餘.c文件要使用a.c裏面的函數,就只須要#include "a.h"就好了。