c 基礎(3 5)預處理 巨集 檔案包含 條件編譯

2021-08-16 04:32:02 字數 1910 閱讀 9381

巨集定義

相關注意點

1.不帶引數的巨集定義:

(1)巨集名一般用大寫

(2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義

(3)可以用#undef命令終止巨集定義的作用域

(4)巨集定義可以巢狀

2.帶引數的巨集定義:

(1)實參如果是表示式容易出問題

#define s(r) r*r

area=s(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;

正確的巨集定義是#define s(r) ((r)*(r))

(2)巨集名和引數的括號間不能有空格

(3)巨集替換只作替換,不做計算,不做表示式求解

(4)函式呼叫在編譯後程式執行時進行,並且分配記憶體。

巨集替換在編譯前進行,不分配記憶體

(5)巨集的

啞實結合

不存在型別,也沒有型別轉換。

(程的引用就是呼叫乙個過程。建立過程的目的就是建立可多次重複執行的程式段,以便多次呼叫它們。通常過程是帶有引數的,在fortran中把引數稱為變元(實元或啞元),過程

定義中的變元是啞元,過程

引用中的變元是實元。在呼叫過程時,要用實元代替啞元,這就是啞實結合。

啞實結合必須遵循三個一致的

原則,否則執行出錯:啞元與實元位置一致;啞元與實元個數一致;啞元與實元型別一致。這就要求記住每個啞元的名及其位置,閱讀實元表時對其中每個表示式要追溯到它原來的啞元是什麼,非常不便,為此f90可以通過如下方法放寬這三個一致的原則:用關鍵字變元放寬位置一致;用可選擇變元放寬個數一致;用類屬過程放寬型別一致。)

(6)巨集展開

(預處理(預編譯)工作

)使源程式變長,

函式呼叫

不會(7)巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)

檔案包含

相關注意點

(1)編譯時以包含處理以後的檔案為編譯單位,被包含的檔案是

原始檔的一部分。

(2)檔案1包含檔案2,檔案2用到檔案3,則檔案3的包含命令#include應放在檔案1的頭部第一行;

(3)包含可以巢狀;

(4)《檔名》稱為標準方式,系統到頭

檔案目錄查詢檔案,

"檔名"則先在當前目錄查詢,而後到頭檔案目錄查詢;

(5)被包含檔案中的靜態全域性變數不用在包含檔案中宣告。

條件編譯

有些語句希望在條件滿足時才編譯。

格式:(1)

#ifdef 

識別符號程式段1

#else

程式段2

#endif

或#ifdef

程式段1

#endif

當識別符號已經定義時,程式段1才參加編譯。

格式:(2)

#ifndef 識別符號

#define 標識1

程式段1

#endif

如果識別符號沒有被定義,則重定義標識1,且執行程式段1。

格式:(3)

#if 

表示式1

程式段1

#elif 表示式2

程式段2

……#elif 表示式n

程式段n

#else

程式段n+1

#endif

當表示式1成立時,

編譯程式段1,當不成立時,編譯程式段2。

使用 條件編譯可以使

目標程式變小,執行時間變短。

預編譯使問題或演算法的解決方案增多,有助於我們選擇合適的解決方案。

此外,還有布局控制:#pragma,這也是我們應用預處理的乙個重要方面,主要功能是為編譯程式提供非常規的

控制流資訊。

C 編譯預處理和巨集 檔案

巨集定義 define 名字 值 直接文字替換 注意結尾沒有分號,因為不是c語句 名字必須是乙個單詞,值可以是各種東西 如果乙個巨集的值超過一行,最後一行之前的行末需要加 預定義的巨集 line 源 當前所在的行號 fine 源 檔案的檔名 date 編譯時的日期 time 編譯時的時間 像函式的巨...

預處理命令,巨集定義,檔案包含,條件編譯

1 c語言的預處理命令都是以 號開始的,他們不是c語言的語句,是在預編譯時處理的。2 巨集定義分為兩種 不帶引數的巨集和帶引數的巨集 所謂的函式巨集 3 巨集定義時末尾一般不要加分號 4 巨集擴充套件的整體或引數一般要用 括起來 5 檔案包含是編寫c語言程式中不可缺少的,很重要 6 使用條件編譯的主...

C語言 預處理指令 檔案包含

感謝 一 基本概念 其實我們早就有接觸檔案包含這個指令了,就是 include,它可以將乙個檔案的全部內容拷貝另乙個檔案中。二 一般形式 1.第1種形式 include 檔名 是系統自帶的 直接到c語言庫函式標頭檔案所在的目錄中尋找檔案 2.第2種形式 include 檔名 一般是使用者自己定義的 ...