1、目錄結構
2、檔案內容
math.h
#ifndef _math_h_
#define _math_h_
/** * 計算階乘
*@param n [需要計算階乘的數]
*@return [階乘]
*/int factorial(int n);
#endif
math.c
#include /**
* 計算階乘
*@param n [需要計算階乘的數]
*@return [階乘]
*/int factorial(int n)
return n*factorial(n - 1);
}
grapnic.h
#ifndef _grapnic_h_
#define _grapnic_h_
/** * 列印階乘數表
*@param n [最大要計算的數]
*/void print(int n);
#endif
grapnic.c
#include #include #include /**
* 列印階乘數表
*@param n [最大要計算的數]
由圖可知,編譯過程分為四個階段,分別為編譯預處理、編譯、彙編和鏈結。每個階段都有自己的作用,其中編譯預處理和鏈結這兩個過程比較複雜。
編譯預處理器本質上做了兩件事情,即巨集替換和檔案包含。不會做語法檢查
1、條件編譯
條件編譯的本質是根據條件來選擇需要保留的**塊,語法如下:
含義:如果表示式的值為真,則保留**塊1,否則保留**塊2
#if 表示式
**塊1
[#else
**塊2]
#endif
含義:如果巨集被定義過,則保留**塊1,否則保留**塊2
#ifdef 巨集名
**塊1
[#else
**塊2]
#endif
含義:如果巨集沒有被定義,則保留**塊1,否則保留**塊2
#ifndef 巨集名
**塊1
[#else
**塊2]
#endif
2、巨集替換
巨集替換的本質就是將巨集名替換為指定的字串。從巨集定義開始到巨集取消,這段巨集名都會被替換。
含義:定義無引數的巨集
#define 巨集名 字串
含義:定義有引數的巨集
#define 巨集名(引數列表) 字串
含義:取消定義過的巨集
#undef 巨集名
3、檔案包含
檔案包含的本質就是把指定的檔案複製到檔案包含指令所在的位置。
含義:在系統指定路徑下定址相應的標頭檔案
#include
含義:首先在當前檔案下尋找標頭檔案,再到系統指定路徑下定址相應的標頭檔案
#include "file"
注意:編譯時,利用-i dir
來指定要搜尋的路徑。
編譯就是把預處理好的檔案翻譯成彙編原始檔,會做語法檢查。
仔細觀察,可以發現,在編譯過程中,並不需要函式、變數的定義,只需要函式、變數的宣告。因此宣告的作用便是告知編譯器資料的寬度、全域性符號名。
彙編就是把彙編原始檔中的彙編指令翻譯成機器碼,並按照規定的格式輸出。
C C 編譯流程(預處理 編譯 彙編 鏈結)
c c 程式常用檔名字尾 序號拓展名說明 1.a 靜態庫,由目標檔案構成的檔案庫 2.c c原始碼,必須經過預處理 3.c cc cpp c 原始碼,必須經過預處理 4.h c c 原始碼的標頭檔案 5.i c經過預處理得到的c原始碼 6.ii c cc cpp經過預處理得到的c 原始碼 7.s 組...
C C 編譯詳解
電子計算機所使用的是由 0 和 1 組成的二進位制數,二進位制是計算機的語言的基礎。計算機發明之初,人們只能降貴紆尊,用計算機的語言去命令計算機幹這幹那,一句話,就是寫出一串串由 0 和 1 組成的指令序列交由計算機執行,這種語言,就是機器語言。想象一下老前輩們在打孔機面前數著乙個乙個孔的情景,噓,...
C C 條件編譯
出處 有些程式在除錯 相容性 平台移植等情況下可能想要通過簡單地設定一些引數就生成乙個不同的軟體,這當然可以通過變數設定,把所有可能用到的 都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分 就沒必要把所有的 都寫進去,就可以用條件編譯,通過預編譯指令設定編譯條件,在不同的需要時編譯不同的 ...