複習:
預處理指令:
c**不能直接被編譯器編譯,需要一段程式把它翻譯一下,負責翻譯的程式叫作預處理器,,翻譯的過程叫預處理,被翻譯的語句叫預處理指令,以#開頭都是預處理指令。
gcc -e code.c 檢視預處理結果
gcc -e code.c -o code.i 把預處理的結果儲存在檔案中。
1、檔案包含
#include 把乙個標頭檔案匯入到當前檔案中。
#include <> 從系統指定的路徑查詢並匯入標頭檔案。
#include 「」 先從當前路徑下查詢,如果沒有再從系統指定的路徑查詢關匯入標頭檔案。
系統是通過設定環境變數、編譯引數-i來指定標頭檔案的查詢路徑。
2、巨集常量
#define 巨集名 字面值資料
如果在**使用了巨集,在預處理時會把所有巨集替換成巨集名後的字面值資料。
優點:提高可擴充套件性,提高可讀性、提高安全性,還可以與case配合使用。
注意:巨集名一般全部大寫,末尾不能加分號,不能直接換行(可以使用續行符)。
預定義的巨集:
file
func
line
date
time
3、巨集函式
#define func(arg) arg*10
不是真正的函式,就是帶引數的巨集,使用巨集函式的位置會被替換成巨集函式後面的**,提供的引數會被替換相應的位置。
注意:可以使用續行符和大括號來保護**。
二義性:由於處理的位置或引數不同巨集函式有多種功能,這種叫巨集函式的二義生,可以在最外層加括號、每個引數加括號來降低產生二義性的可能 。
運算子:
# 把巨集函式的引數變成字串
## 合併兩引數變成識別符號
4、條件編譯
根據條件決定是否生成**或生成那部分**。
#if/#elif/#else/#ifdef/#ifndef/#endif
標頭檔案衛士:
#ifndef filename_h
#define filename_h
#endif//filename_h
版本控制:
#if version >=3
#elif version >=2
#elif version >=1
#else
#endif
判斷器編譯:
#if __cplusplus
// c++編譯器
#else
// c編譯器
#endif
系統位數判斷:
#ifx86_64
printf(「64位系統\n」);
#elifi386
printf(「32位系統\n」);
#endif
5、常考的筆試面試題
定義乙個巨集表示一年有多少秒,忽略閏年問題。
#define year_sec (365243600u)
在型別重定義時#define與typedef的區別?
在定義常量時#define與const的區別?
巨集函式與普通函式的區別?
標頭檔案中應該寫什麼
問題1:標頭檔案可能被任何原始檔包含,意味著標頭檔案中的記憶體會在多個目標檔案中存在,合併時不能衝突。
重點:標頭檔案中只編寫宣告語句,不能有定義語句。
全域性變數宣告
函式宣告
巨集常量巨集函式
typedef 型別重定義
結構、列舉、聯合的型別宣告
標頭檔案的編寫原則:
1、對每個.c檔案寫乙份.**件,.**件是對.c檔案的說明。
2、如果需要用到某個.c檔案的變數、函式、巨集,只需要把它的標頭檔案匯入。
3、.c檔案也叫匯入它的.h 目的是讓宣告與定義一致。
標頭檔案的互相包含:
假如a.h包含的b.h,b.h又需要包含a.h,這種情況編譯就會出錯。
解決方案就是把a.h中需要的內容和b.h中需要的內容提取出來,編寫乙個c.h。
錯誤:未知的型別名』***x』 一般都是標頭檔案互相包含導致的。
makefile
makefile是由一系列編譯指令組成的可執行文字檔案,也叫編譯指令碼。
在終端執行make命令會自動執行makefile指令碼中的編譯指令,它可以根據檔案的修改時間來判斷那些檔案需要編譯,那些不需要從面提高編譯效率。
編譯規則:
1、如果此專案沒有編譯,則編譯所有.c檔案,並鏈結成可執行程式。
2、如果某個.c檔案被修改,則此次只編譯修改過的.c檔案並鏈結。
3、如果某個.**件被修改,依賴它的所有.c都要重新編譯並鏈結。
乙個最簡單的mafile指令碼:
執行目標:依賴
編譯指令
被依賴的目標1:依賴的檔案
編譯指令
被依賴的目標2:依賴的檔案
編譯指令
…負責清理的執行目標:
rm …
2048遊戲:
檔案規則:
main.c 程式入口
game2048.c game2048.h 遊戲的業務邏輯
direction.c direction.h 方向鍵處理
tools.c tools.h 工具函式
建立指令碼:project_create.sh
C語言基礎 13 函式
在使用函式前必須定義或者宣告函式。double circle double r int main double circle double r 在呼叫函式的時候,函式大多數都有引數,主調函式和被呼叫函式之間需要傳遞資料。在定義函式時函式名後面括弧中的變數名稱為 形式引數 簡稱形參。在呼叫函式時,函式...
C 程式語言基礎13
string類用來比較兩個字串 查詢和抽取串中的字元或子串。string可以看做是char的唯讀陣列。c 中字串有乙個重要的特性 不可變性,字串一旦宣告就不再可以改變。注意 對該類物件的任何操作都將返回乙個新的字串物件 除了clone clone直接將該字串的引用返回了 示例 string s1 a...
C語言基礎 二維陣列13
二維陣列的本質其實就是乙個元素是一維陣列的一位陣列。元素型別 陣列名 行數 列數 元素初始化 1 全部初始化.a.先宣告,再使用下標來初始化.b.在宣告的同時,就初始化陣列的每乙個元素.int arr 3 4 第0行的資料 第1行的資料 第2行的資料.裡面的大括弧,就表示1行.10 20 30 40...