巨集定義
相關注意點
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 檔名 一般是使用者自己定義的 ...