C語言中的預處理命令

2021-07-03 14:59:43 字數 2312 閱讀 5278

預處理指令

1.在源程式編譯之前,先進行一些特殊的預處理指令作解釋,產生乙個新的源程式(這個過程稱為編譯預處理),之後在進行通常的編譯。

2.為了區別預處理指令和一般的c語言,所有預處理指令都是以 # 開頭,並且結尾無分號

3.預處理指令可以出現在程式的任何位置,它的作用範圍是從它出現的位置到檔案尾。

4.c語言的預處理指令有:巨集定義,檔案包含,條件編譯

巨集定義:分為 不帶引數的巨集定義 和 帶引數的巨集定義

不帶引數的巨集定義

int b=6;

int a[b]=; 這是錯誤的,因為b是變數。

#define num 6    //不寫等號和分號,使用空格分割,num叫做巨集名,6代表替換巨集名的字串

int a[num]=;

帶引數的巨集定義

#define sum(a,b) a+b

只是簡單的字串替換

#define mul(a,b) a*b

int a = mul(3+4,1+2); //就不對了

則#define mul(a,b) (a)*(b) //就對了

如果:int a = mul(10,10)/mul(2,2);//錯了,不是25

(a)*(b)

(10)*(10)/(2)*(2)  //按照正常的順序,10*5*2=100所以錯了

應該#define mul(a,b) ((a)*(b))

巨集定義是在預編譯時候,而函式是在執行時候呼叫,故巨集定義的效率比函式效率高一些。巨集定義不會檢測型別,這是缺點。

條件編譯

很多情況下,希望程式的其中一部分**只有在滿足一定條件下才進行編譯,否則不參與編譯(只有參與編譯的**最終才能被執行),這就是條件編譯。

#if 條件1

...code1...

#elif 條件2

...code2...

#else

...code3...

#endif

1.如果條件1成立,那麼編譯器就會把#if與#elif之間的code1**編譯進去(注意:是編譯進去,不是執行,和平時用的if-else是不一樣的)

2.以此類推

3.注意,條件編譯結束後,要在最後麵加乙個#endif,不然就不對了

4.不能拿變數做條件進行判斷,而是使用巨集定義來作為條件進行判斷。

#define num 10

#if num > 0

print("num>0");

#elif num == 0

print("num=0");

#else

print("num<0");

if(num>0)else if(num==0)else

這兩段**的區別在於:條件編譯,只編譯一條指令,而if-else if-else要編譯所有指令。

#if defined()和#if !defined()的用法

#if和#elif後面的條件不僅僅可以用來判斷巨集的值,還可以判斷是否定義過某個巨集,

#if defined(max)

...code...

#endif

#if !defined(max)

...code...

#endif

#ifdef和#ifndef的使用

還有 #ifdef和#ifndef的使用

#ifdef max

...code...

#endif

#ifndef max

...code...

#endif

include包含檔案

#include "one.h"

#include 的區別在於

"one.h"會在大範圍尋找,系統會先在源程式當前目錄下尋找,若找不到,再到作業系統的path路徑中查詢,最後才到c語言庫函式標頭檔案所在目錄中查詢

會在小範圍尋找,直接到c語言庫函式標頭檔案所在的目錄中尋找檔案

1.#include指令允許巢狀包含,比如a.h包含b.h,b.h包含c.h,但是不允許遞迴包含,比如 a.h 包含 b.h,b.h 包含 a.h

2.使用#include指令可能導致 多次包含同乙個標頭檔案,降低編譯效率

3.要防止多次包含乙個標頭檔案降低編譯效率,所以要用到條件編譯

#ifndef _one_h_

#define _one_h_

void one();

#endif

以後寫標頭檔案一定包含這個條件編譯防止降低效率。

標頭檔案中儲存的這個函式的宣告,而不是定義,這些函式預設為外部函式,這樣可以擴大函式的作用域。

C 語言中的預處理命令

由於預處理命令不是 c 語言本身的組成部分,所以 c 編譯程式不能識別它們,也就不能直接對它們進行編譯,所以在 c 程式編譯之前,必須先對預處理命令進行處理,處理後程式中不再包括預處理命令了,再由編譯程式處理得到目標 c 語言提供的預處理命令共有三中 巨集定義,檔案包含和條件編譯,預處理命令以 開頭...

c語言中的編譯預處理命令

注意 1.所有編譯預處理語句以 開頭 2.每個預處理命令必須單獨佔一行 3.語句末尾不使用分號作為結束符 4.預處理語句主要有巨集,條件編譯和檔案包含 定義語句的格式如下 define 識別符號 字串 作用 用乙個簡單的名稱代替乙個長的字串。識別符號 稱為 巨集名 在編譯時將巨集名替換成字串的過程稱...

c語言中的預處理(1)

剛接觸c語言的人都知道,每次主程式開始前都得寫乙個 include。但是卻不知道為什麼非要加這個東西,學了一段時間後,似乎會明白一點,但還是稀里糊塗的,在這裡,我們就把這玩意兒抽絲剝繭弄個明白。在c語言裡,有一種非常有用而又必不可少的部分,叫做預處理,說道這兒有人就笑了,不就是 include和 d...