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.列舉只可以表示整型,巨集...