預處理指令
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...