xx.h
和xx.c
的奧妙
示例**:
/*********************
a.h*********************/
#ifndef __a_h__
#define __a_h__
void fun();
#endif
/********************* a.c*********************/
#include "a.h"//為什麼要加?
void fun()
/******************** main.c********************/
#include "a.h"
int main( )
為什麼經常見
xx.c
裡面include
對應的xx.h
?a.c
中的#include "a.h"
是否多餘?
主要有兩種原因: ①
如果.c
中的函式
也需要呼叫同個
.c中的其他函式,那麼這個
.c往往會
include
同名的.h
,避免宣告和呼叫順序出現問題(
c語言要求使用之前必須宣告,而
include
同名.h
一般會放在
.c的開頭)。 ②
.c中的函式中經常會使用了同名
.h檔案定義的巨集,或者
typedef
定義的新型別。
有很多任務程甚至把這種寫法約定為**規範,以規範出清晰的**來。
由此,有很多任務程甚至把這種寫法約定為**規範,以規範出清晰的**來。以上示例中,顯示是可有可無的。 從
c編譯器角度看,.h和
.c只是字尾符號,毫無意義。換句話說,就是.h和
.c沒有必然聯絡。 1.
預處理
預處理只是簡單的替換,
#include "xx.h"
中所包含的完全展開到包含它的
.c 檔案中。
.h只起到這個作用。 2.
編譯過程
以乙個檔案為基本的乙個編譯單元。乙個
.c檔案生成乙個
.o檔案,在編譯階段,只要
.c或者包含的
.h中已經宣告的函式或變數,
.c都會生成相應的
.o檔案。編譯階段對函式或變數的定義並無要求,所以在
main.c
中,即便
void fun()
是在a.c
中定義的,但其包含的標頭檔案中已經宣告,即可順利編譯。
3.連線過程 將
a.o和
main.o
結合起來,生成可執行檔案。
若只是宣告,沒有在其他的
.c中定義,連線時就會出錯。也就是說若
void fun()
沒有在a.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一般只用來放宣告,而放不定義)沒有任何壞處,不會影響編譯。
指標的奧妙
今天看了指標這一章書,看得有點似懂非懂。開始知道原來指標是c語言中的精華,想到自己卻對指標一點也不知道怎麼去用,自己都覺得有點慚愧啊。今天花了好長的時間去寫指標這篇課後習題10.3這道題,就是因為自己對指標不懂如何運用,才搞得自己花費很長時間才寫出來了。題目要求 輸入10個整數,將其中最小的數與第乙...
c語言 《指標的奧妙》
近來,又有同學問我 關於指標的知識,回顧兩年的程式設計之路,不知不覺,我離c語言的道路方向也偏差了很多,其實我好久都沒有碰過c語言了。但是這次回顧,我又對指標有了新的認識。首先 指標他到底是個什麼東西呢?其實他並沒有多麼奇妙,他就是乙個普通的變數,不過他裡面放的是同型別的位址,哈哈,我還是舉個例子吧...
2015 3 21 學習豆瓣應用的奧妙
資料分析 padas,scipy python,ror的優點是產品起步構建很快 ror的效能是能把產品維護到a輪併發 py的效能要害 gil,pypy主要解決這個問題 後端出現效能問題,用go解決,比如豆瓣的廣告投放服務 動態語言應用比較注重測試 一定要review 考慮使用git 用後端的統一 全...