本章重點:c語言標頭檔案。
用命令列編譯c檔案我們已經知道了
簡單談一下他的編譯過程..
首先我們建立了test.c的c檔案 也就是原始檔, 接著預編譯,再由編譯器編譯為彙編**,
彙編器把彙編**編譯為目標檔案(.o),最後由聯結器把所有目標檔案與庫檔案連線起來生成可執行檔案
原始檔->預編譯檔案->彙編**檔案->目標檔案->鏈結後生成可執行檔案;
下面學習標頭檔案與實現檔案的意義
我們都知道c語言程式設計第一行是什麼呢
1 #include 2是的,是#include匯入標頭檔案 大家可以試試把第一行去掉intmain()
gcc 編譯是不是error了?錯誤提示告訴你printf函式不存在 是的,這個列印輸出只是庫檔案裡的乙個方法,所以必須導入庫檔案。
如果我們自己編譯的程式有幾千行甚至更多..都寫在乙個test.c那麼維護起來是不是很麻煩?**重用性也很低..
對於這種問題標頭檔案和實現檔案就能很好地解決了
標頭檔案是以.h結尾的檔案 它的作用相當於其他語言的說明文件..標頭檔案內只是宣告屬性,變數或方法並不去實現
那麼如何實現這些方法呢?都寫在實現檔案.c裡面 當然 兩個檔案的檔名是相同的 只是字尾不同
我們來做個例子..
建立標頭檔案testa.h**只有一行 宣告乙個sum方法;
1int sum(int,int);
建立實現檔案testa.c實現這個方法;
1建立測試檔案test.cint sum(int i,intj)2
1 #include 2 #include "編譯執行 gcc -o test test.c testa.ctesta.h"3
intmain()
標頭檔案是不需要編譯的 但是實現檔案需要跟測試檔案一起進行連線 也可以先把實現檔案編譯成目標檔案
gcc -c testa.c//得到目標檔案testa.o
gcc -o test test.c testa.o
執行test.exe可以看到result輸出了sum方法的返回值11;
可能有人會問 有實現檔案實現方法就可以了 為什麼要標頭檔案呢 直接匯入實現檔案testa.c不可以嗎?
當然不是不可以,直接#include "testa.c"
匯入實現檔案不用標頭檔案也是可以的;但標頭檔案的意義何在呢?
這裡就要講到乙個依賴倒轉的理念了..依賴倒轉是指:高層如果依賴於底層的話底層改變,高層也不得不改變,
那麼**維護和重用重用性就大大降低了,所以高層都應該依賴於抽象而不是底層這是依賴倒轉原則。
只是這樣說的話很多人可能不理解..我們來做個例子..
假設有兩個實現檔案testa.c,testb.c,各自對應標頭檔案testa.h,testb.h
且testa.h依賴於testb.h
testa.c
int sum(int i,inttesta.hj)int mult (int i,int
j)
#include "testb.ctestb.h
"int sum(int,int
);int mult (int,int);
1testb.hint multb(int i,intj)2
int multb(int,int);test.c
1 #include 2 #include "可以看到testa.c的mult()方法是依賴於testb.c的multb()方法實現的;testa.c"3
intmain()
我們先來把testa.c,testb.c都編譯為目標檔案
gcc -c testa.c testb.c//得到testa.o,testb.o兩個目標檔案
再把目標檔案與測試檔案鏈結
gcc test.c testa.o testb.o//生成可執行檔案
可以看到testa.c的標頭檔案依賴於testb.c的標頭檔案實現了mult()方法
如果對testb.c的方法進行修改呢
testb.c
1我們把乘法改成了除法 重新把testb.c編譯成目標檔案:gcc -c testb.cint multb(int i,intj)2
可以看到testa.o並沒有重新編譯 但testa.c的mult()方法又是依賴於testb.c 為什麼testa.c不用重新編譯呢?
因為依賴所寫是在標頭檔案 程式通過標頭檔案找到.o檔案..標頭檔案相當於宣告了乙個抽象方法..具體實現要看實現類怎麼寫
也就是說testa.c的mult()方法是依賴於testb.h內的乙個抽象方法,所以即使testb.c改變了,testa.c依然能使用而不用重新編譯。
下面大家做乙個測試
有a.c,b.c兩個實現檔案(內容隨意)分別對應a.h,b.h兩個標頭檔案..
檔案a.h依賴於檔案b.h,檔案b.h又依賴於檔案a.h
test.c測試#include匯入a.h 編譯執行
Objective C學習準備 C語言
今天我們一起開始學習ios.ios開發主流程式語言是object c以及swift。根據目前企業調查,objuctiva c是屬於目前比較多企業運用的語言.所以我們決定有能力者專注於oc.跑題了.說道入門,今天我們來複習一下c語言 最簡單的基礎變數定義,流程控制就略過了,不懂得可以先看看c語言基礎那...
NFC學習 準備
公司現在研發的tablet需要支援nfc功能,android 4.1.1的版本。前段時間nfc還沒有調通,boss讓我研究一下上層支援下。小弟 懂啊。最後換成了另外的同事支援了。由此,我準備利用點時間好好研究下nfc,對這個新興的技術做點了解,研究。以後會把自己研究過程的東西一點一點記錄下來,一方面...
Python學習準備
1,執行 cmd開啟命令提示行,輸入python,如果環境配置好了最下面的一行會出現三個箭頭 2,退出 輸入exit 便會退出到windows命令行內 1,建立資料夾取名為hello.py。注意檔案字尾為 py 2,檔案內編寫print helloword 3,cmd開啟命令列切換到檔案存放的目錄內...