C C 編譯預處理

2021-04-13 02:03:56 字數 2024 閱讀 6701

今天做練習用到頭檔案包含時遇到了 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 是一種最為常見的預處理,主要是做為檔案的引用組合源程式正文。巨集替...