編譯預處理

2021-07-25 13:44:59 字數 2457 閱讀 1145

1、預處理指令是以#號開頭的**行。#號必須是該行除了任何空白字元外的第乙個字元。#後是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字元。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源**做某些轉換。下面是部分預處理指令:

#           空指令,無任何效果

#include 包含乙個源**檔案

#define 定義巨集

#undef 取消已定義的巨集

#if 如果給定條件為真,則編譯下面**

#ifdef 如果巨集已經定義,則編譯下面**

#ifndef 如果巨集沒有定義,則編譯下面**

#elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面**,其實就是else if的簡寫

#endif 結束乙個#if……#else條件編譯塊

#error 停止編譯並顯示錯誤資訊

2、巨集定義

(1)巨集

定義常量與命令-避免幻數。

#define max 100

#define size 1024

#define login_success 1

#define login_fail 0

【注意】:在巨集定義的命名時,盡量能夠清晰的表明其用途。

(2)巨集定義函式

【注意】巨集函式與自定義函式的區別?

從以下幾個方面講:

(1)巨集函式在預處理階段處理,而自定義函式在編譯階段處理。

(2)巨集函式比較靈活,但會產生一定的***,因為巨集函式只是傻瓜式的替換,不會進行語法分析。

(3)自定義函式需要分配記憶體空間、釋放等一系列的操作,二巨集函式只是替換,因此巨集函式的效率相對高一些。

一般將簡單的函式或者平凡被呼叫的函式用巨集函式替代。

【注意2】

以編譯時間換空間–巨集函式;

以空間換執行時間–內斂函式(inline);

3、內建巨集定義

func(顯示函式名)

line(顯示行號)

time(顯示時間)

date(顯示日期)

【注意3】typedef與#define的區別?

(1) 執行時間不同

關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。

define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何檢查。

(2)功能不同

typedef用來定義型別的別名,定義與平台無關的資料型別,與struct的結合使用等。

define不只是可以為型別取別名,還可以定義常量、變數、編譯開關等。

(3)作用域不同

define沒有作用域的限制,只要是之前預定義過的巨集,在以後的程式中都可以使用。

而typedef有自己的作用域。

詳細內容參考

4、條件編譯指令

#if#endif、/#else、/#elif指令

#ifdef和#ifndef指令

【注意4】#ifndef和#define的作用

防止標頭檔案重複包含導致的重複定義。

這二者主要用於防止重複包含。我們一般在.h標頭檔案前面加上這麼一段:

//標頭檔案防止重複包含

#ifndef funca_h

#define funca_h

//標頭檔案內容

#end

if這樣,如果a.h包含了funca.h,b.h包含了a.h、funca.h,重複包含,會出現一些type redefination之類的錯誤。

#if defined等價於#ifdef; #if

!defined等價於#ifndef

5、其他預處理命令

#error指令將使編譯器顯示一條錯誤資訊,然後停止編譯。

#line指令改變_line_與_file_的內容,它們是在編譯程式中預先定義的識別符號。

#pragma指令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告資訊。

複製**

//例10,#line舉例

#line 100 //初始化行計數器

#include//行號100

int main()

編譯預處理

所謂編譯預處理,就是在c源程式的編譯之前,由編譯預處理程式對這些編譯預處理命令進行處理的過程。最常見的就是常量的替換。編譯預處理按功能可以分為巨集定義,檔案包含和條件編譯三類。編譯預處理命令以 開頭,下面進行詳細說明 一.巨集定義與符號常量 1.無參巨集定義 define 識別符號 字串 1 巨集名...

編譯預處理

1.巨集定義指令 1 定義變數與命令 避免幻數 在巨集定義命名時,盡量能清楚的表明功能,大寫 不能以 開頭易與內建巨集衝突 2 定義巨集函式 define max a,b a b a b int num max 6,5 6 5 6 5 用編譯時間換記憶體空間的是巨集函式 用記憶體空間換執行空間的是內...

編譯預處理

1 定義常量與命令 避免幻數 定義巨集時,避免以 開頭,以防與內建巨集定義衝突。巨集和列舉的區別 a.列舉常量是實體常量中的一種,但巨集不是實體 b.列舉常量屬於常量,但巨集不是常量 c.列舉常量具有型別,但巨集沒有型別。列舉型別主要用於限制性輸入,巨集只是預處理替換符 d.列舉只可以表示整型,巨集...