程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> .c文件和.h文件的概念與聯系

.c文件和.h文件的概念與聯系

編輯:關於VC++

如果說難題最難的部分是基本概念,可能很多人都會持反對意見,但實際上也確實如此。 我高中的時候學物理,老師抓的重點就是概念——概念一定要搞清,於是難題也 成了容易題。如果你能分析清楚一道物理難題存在著幾個物理過程,每一個過程都遵守那一 條物理定律(比如動量守恆、牛II定律、能量守恆),那麼就很輕松的根據定律列出這個過程 的方程,N個過程必定是N個N元方程,難題也就迎刃而解。即便是高中的物理競賽難題,最難 之處也不過在於:

(1)、混淆你的概念,讓你無法分析出幾個物理過程,或某個物理過程遵循的那條物理定 律;

(2)、存在高次方程,列出方程也解不出。而後者已經是數學的范疇了,所以說,最難之 處還在於掌握清晰的概念;

程序設計也是如此,如果概念很清晰,那基本上沒什麼難題(會難在數學上,比如算法的 選擇、時間空間與效率的取捨、穩定與資源的平衡上)。但是,要掌握清晰的概念也沒那麼容 易。比如下面這個例子,看看你有沒有很清晰透徹的認識。

//a.h
void foo();
//a.c
#include "a.h" //我的問題出來了:這句話是要,還是不要?
void foo()
{
  return;
}
//main.c
#include "a.h"
int main(int argc, char *argv[])
{
  foo();
 return 0;
}

針對上面的代碼,請回答三個問題:

a.c 中的 #include "a.h" 這句話是不是多余的?

為什麼經常見 xx.c 裡面 include 對應的 xx.h?

如果 a.c 中不寫,那麼編譯器是不是會自動把 .h 文件裡面的東西跟同名的 .c 文件綁 定在一起?

(請針對上面3道題仔細考慮10分鐘,莫要著急看下面的解釋。:) 考慮的越多,下面 理解的就越深。)

好了,時間到!請忘掉上面的3道題,以及對這三道題引發出的你的想法,然後再聽 我慢慢道來。正確的概念是:從C編譯器角度看,.h和.c皆是浮雲,就是改名為.txt、.doc也 沒有大的分別。換句話說,就是.h和.c沒啥必然聯系。.h中一般放的是同名.c文件中定義的 變量、數組、函數的聲明,需要讓.c外部使用的聲明。這個聲明有啥用?只是讓需要用這些 聲明的地方方便引用。因為 #include "xx.h" 這個宏其實際意思就是把當前這一 行刪掉,把 xx.h 中的內容原封不動的插入在當前行的位置。由於想寫這些函數聲明的地方 非常多(每一個調用 xx.c 中函數的地方,都要在使用前聲明一下子),所以用 #include "xx.h" 這個宏就簡化了許多行代碼——讓預處理器自己替換好了。也 就是說,xx.h 其實只是讓需要寫 xx.c 中函數聲明的地方調用(可以少寫幾行字),至於 include 這個 .h 文件是誰,是 .h 還是 .c,還是與這個 .h 同名的 .c,都沒有任何必然 關系。

這樣你可能會說:啊?那我平時只想調用 xx.c 中的某個函數,卻 include了 xx.h 文件,豈不是宏替換後出現了很多無用的聲明?沒錯,確實引入了很多垃圾 ,但是它卻省了 你不少筆墨,並且整個版面也看起來清爽的多。魚與熊掌不可得兼,就是這個道理。反正多 些聲明(.h一般只用來放聲明,而放不定義,參見拙著“過馬路,左右看”)也 無害處,又不會影響編譯,何樂而不為呢?

翻回頭再看上面的3個問題,很好解答了吧?

答:不一定。這個例子中顯然是多余的。但是如果.c中的函數也需要調用同個.c中的其它 函數,那麼這個.c往往會include同名的.h,這樣就不需要為聲明和調用順序而發愁了(C語 言要求使用之前必須聲明,而include同名.h一般會放在.c的開頭)。有很多工程甚至把這種 寫法約定為代碼規范,以規范出清晰的代碼來。

答:1中已經回答過了。

答:不會。問這個問題的人絕對是概念不清,要不就是想混水摸魚。非常討厭的是中國的 很多考試出的都是這種爛題,生怕別人有個清楚的概念了,絕對要把考生搞暈。

搞清楚語法和概念說易也易,說難也難。竅門有三點:

不要暈著頭工作,要抽空多思考思考,多看看書;

看書要看好書,問人要問強人。爛書和爛人都會給你一個錯誤的概念,誤導你;

勤能補拙是良訓,一分辛苦一分才;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved