C語言基礎13

2021-10-08 16:20:23 字數 2714 閱讀 6268

複習:

預處理指令:

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...