今天做練習用到頭檔案包含時遇到了 redefinition 的報錯。仔細一看才發現是 我沒有很好地使用條件編譯來協調標頭檔案包含關係(平常說的 「標頭檔案衛士」就這麼回事 )。
於是找來塵封已久的<c預處理程式 :
在用c編譯程式對c源**進行編譯之前,即在語法分析、**生成和優化之前,由c 預處理程式對源**進行第一次處理。處理時,它忽略注釋語句,加入.h標頭檔案,並按定義進行替換。預處理的輸出,即是編譯程式的輸入。
預處理命令必須單行書寫,不以 " : " 結束。
編譯預處理包括: 巨集定義;條件編譯; 檔案包含。
一、 巨集定義
巨集 : c語言源程式中用乙個識別符號(巨集名)來表示乙個字串。
1、巨集名慣用全大寫字母命名。僅作簡單置換,不分配記憶體空間。
2、巨集替換只對單獨的巨集名單詞進行,對於括在引號中的字串不起作用。
3、巨集定義允許巢狀。
4、帶引數的巨集展開時,是用實參字串替換形參字串,由於運算子的優先順序問題,可能發生的邏輯錯誤。比較好的辦法是巨集定義的形參加括號。
#define multiply(m, n) (m)*(n)
int a = 5, b = 6;
cout<5、巨集名與參數列間不能有空格,否則將作為無引數巨集來處理。
6、巨集定義中,若替換字串中的形式引數在引號中,則巨集展開時不被實參替換。但如果在替換字串中,形式引數以#作為字首,那麼巨集展開時它將被帶引號的實參字串替換.
#define myprint1(exp) printf("exp=%d/n",exp)
#define myprint2(exp) printf(#exp"=%d/n",exp)
void main()
7、深刻體會帶參巨集定義和函式中引數的區別。(執行時間是預處理還是編譯;傳遞還是直接替換;是否佔據記憶體空間等方面 )。
8、取消巨集: #undef 識別符號(在取消乙個巨集之前,那個巨集一直有效,如果在取消之前定義了乙個同名的巨集,則新定義的巨集覆蓋原先的巨集)。
二、條件編譯
對源程式的一部分內容進行編譯,即不同的編譯條件產生不同的目標**。使源**能更迅速、更容易地進行修改,並使目標**縮短。這樣,當程式在不同系統上編譯、在同一系統不同編譯器上編譯或進行不同目的的編譯時,減少對程式語句的修改。
重要作用: 直接取捨程式語句和協調多個標頭檔案。
常見的三種格式:
1、#ifdef 識別符號
程式段1
#else
程式段2
#endif // 把 #ifdefine 換為 #ifndefine 為另一種。
2、// 表示式為常量整型表示式(其中不能包含sizeof、強制型別轉換運算子或列舉常量),非 0 即為真。
# if 表示式1
程式段1
…# elif 表示式m
程式段m
# else
程式段n
#endif
三、檔案包含
檔案包含命令 #include 把「檔名」指定的檔案內容複製到本檔案(即是用指定檔案的內容去替換# include命令列). 被包含檔案中一般定義符號常量、巨集,或宣告函式原型,類和型別定義。 一般不在被包含檔案中定義變數。
讓我們看乙個我今天遇到的乙個類似問題的正確做法:(避免重複定義)
zp.h 檔案:
#ifndef zp
#define zp
int a = 5;
#endif
zp1.h 檔案:
#include "zp.h"
int b= a+1;
zp2.h 檔案:
#include "zp.h"
int c = a+2;
main.cpp 檔案
#include "zp1.h":
#include "zp2.h"
void main() {
cout<學而時習之,不亦樂乎。 --- confucius.
C C 編譯預處理
1.c c 編譯預處理 預處理 或稱預編譯 是指在進行編譯的第一遍掃瞄 詞法掃瞄和語法分析 之前所作的工作。預處理指令指示在程式正式編譯前就由編譯器進行的操作,可放在程式中任何位置。預處理是 c語言的乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的...
c c 編譯預處理
1 include 頭檔名稱 2 include 頭檔名稱 第一種形式一般用來包含開發環境提供的庫標頭檔案,它指示編譯預處理器 在開發環境中設定的路徑中找所需的標頭檔案。第二種形式一般用來包含自己寫的標頭檔案,它指示編譯預處理器在當前工 作目錄中搜尋標頭檔案,如果找不到再到開發環境所設定的路徑中找 ...
C C 編譯預處理指令
眾所周知,你的程式編譯前要做的事就是掃瞄源 對其做初步的轉換,產生新的源 提供給編譯器,這個過程就叫編譯預處理。這個處理過程由預處理器來完成,預處理器是在程式真正執行前由編譯器呼叫的預處理程式。常見的預處理有以下三種 include 是一種最為常見的預處理,主要是做為檔案的引用組合源程式正文。巨集替...