C語言 第十章檔案編譯

2021-09-28 20:35:11 字數 2879 閱讀 2844

1.預處理

-e    進行預處理工作

工作內容: 進行預處理(預處理指令),進行巨集替換和標頭檔案匯入或者條件編譯等

去掉注釋內容

不會自動生成檔案

-o 可以指定生成的目標檔案 .i

2.編譯

-s    檢查語法錯誤  生成匯程式設計序

工作內容: 檢查源**或者經過預處理之後**的語法錯誤

生成匯程式設計序 .s

3.彙編 其實是用as命令

-c    

工作內容: 把彙編**彙編成目標檔案(二進位制)

生成目標檔案 .o

4.鏈結 其實是用ld命令

鏈結乙個或者多個目標檔案生成可執行程式   預設是a.out

語法錯誤檢查:在編譯階段

-l 選項:鏈結的庫 數學庫 -lm

-i-d

-o

預處理指令

在預處理階段就會進行處理的指令

以#開頭的指令

#include 包含標頭檔案

匯入標頭檔案中的**

呼叫了標準庫的函式時需要匯入標頭檔案

#include <> 與 #include ""的區別

<>   從系統指定的路徑(可配置)搜尋包含的標頭檔案

"" 從當前目錄搜尋包含的標頭檔案,

如果在當前目錄下沒有找到,則去系統指定的目錄下搜尋

如果是包含自己寫的標頭檔案時用"",包含標準庫的一般用<>

#define

巨集名 一般用大寫字母

巨集定義 在預處理階段進行簡單的巨集替換

#define pi 3.14

巨集函式#define pow(x) ((x)*(x))

預處理階段不進行運算 只進行替換

注意: 不要在巨集定義後面加上 ;

巨集函式需要給每個引數都加上小括號 以及最後整體加上小括號 避免產生歧義

巨集函式和引數列表之間不能有額外的空格

#define pow (x) ((x)*(x)) //錯誤 pow和(x)之間多了乙個空格

定義乙個巨集

計算一年有多少毫秒 不用關心閏年

#define msofyear (3652460601000)l

\ 可以連線巨集定義

一般而言 巨集只能放在一行 但是可以通過 \ 來連線多行 作為同乙個巨集定義

# 可以把乙個識別符號變成乙個字面值字串

#define tostr(x) #x

#define print(x) printf(#x"=%d\n",x)

## 可以生成新的識別符號

巨集的作用

1.方便修改

2.簡化程式設計

3.引數沒有型別限制 靈活

條件編譯

分支選擇語句

只有當執行時才確定執行哪乙個分支 會把兩個分支的語句都編譯到**中去

編譯時 可以選擇 編譯的**

#if 根據巨集的值來進行條件編譯

#elif

#else #否則

#endif #條件編譯結尾

#ifdef #if defined 如果定義了某個巨集 用巨集是否定義來進行條件編譯

#ifndef 如果沒有定義某個巨集

#undef 刪除乙個巨集 取消巨集定義

#ifdef zbs

//如果定義了 zbs 這個巨集 則編譯該分支

#else

//如果沒有定義 zbs 這個巨集 則編譯些分支

#endif

#ifdef linux

//linux系統**

#endif

#ifdef linux //如果定義了linux巨集

//linux系統**

#else //沒有定義

//其它系統**

#endif

巨集可以在**中用 #define 定義

也可以在編譯時用 -d 巨集名稱 來定義巨集

根據巨集的值:

#if n==1

#elif n==2

#elif n==3

#else //巨集沒有定義 以及不滿足上面情況下編譯

#endif

#ifdef/#ifndef/#if defined #endif //巨集是否定義來進行條件編譯

#if /#elif #endif //巨集的值來進行條件編譯

多檔案程式設計:

標頭檔案 .h 檔案

需要把函式的宣告放在.**件中

實現檔案放在.c檔案中

標頭檔案衛士

用於防止多次引用該標頭檔案   

如果不加 程式稍微複雜一些就可能引發重複定義的錯誤

#ifndef ***_h__

#define ***_h__

#endif //***_h__

多文程式設計的步驟:

1.寫乙個 .h 檔案

標頭檔案衛士

函式宣告 型別宣告 宣告全域性變數(不是定義)

2.寫.c檔案用於實現 .**件中宣告的函式

需要包含 .h 檔案 #include ""

生成 .o 檔案

3.寫乙個.c 檔案裡面 寫 main函式 呼叫其它函式

gcc -c main.c

gcc *.o 鏈結所有的目標檔案 生成 可執行程式

編譯原理第十章 優化

1 區域性優化是在 b 範圍內進行的優化?a 過程體 b 基本塊 c 函式體 d 迴圈體 2 有關基本歸納變數的作用,錯誤的是 d a 自身定值 b 計算其它同族歸納變數 c 控制迴圈 d 記錄迴圈的結果 3 在迴圈內可以實行的優化有 d a 外提 b 刪除歸納變數 c 強度削弱 d 以上都有 4 ...

C 程式設計第十章

軟體開發者將被開發的整個業務範圍稱作 問題域 按一下步驟建立物件層。1 將問題域和系統責任作為出發點 2 正確運用抽象原則 3 尋找候選物件的基本方法尋找候選物件的基本方法的主要策略是從問題域 系統邊界和系統責任三方找出可能候選物件。1 考慮問題域中可啟發分析人員發現物件的因素。2 考慮系統邊界可以...

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...