1. 程式人生 > >c語言前處理器指令

c語言前處理器指令

c語言有強大的前處理器指令,在很多情況下都是很有用的。


首先介紹什麼是前處理器,前處理器就是在程式的原始碼編譯之前,會對程式進行翻譯工作,就是把這程式\之後的回車去掉,以及去掉註釋,然後會把之間的空白自符去掉,然後再根據預處理指令把程式進行預處理操作,等著一切都進行完畢以後,就會進行編譯操作。


#define與#undef的使用:


#define是最常用的前處理器指令,他代表一個巨集定義。例如這樣一個例子,#define A 1就代表用1代替接下來的程式碼裡邊出現的A,由於這是預編譯指令,是在程式的編譯之前進行的,所以完全不必擔心程式執行的效率的影響,這麼做反而會使得程式的可讀性以及可維護性得到很大的提高,強烈建議以後常用的常量都用#define來表示。


另外,c語言允許對巨集定義的重定義,只是會覆蓋之前的巨集定義而已。


#define不僅可以巨集定義數值常量,還可以巨集定義函式,其實這不能稱之為函式,只是把對應的自符串替換成為對應的程式碼而已。例如#define S(X) X*X 的話,在接下來的程式中使用S(2)的話,就會被前處理器替換成為2*2,但是有一個缺點,如果是S(2+1)的話,就會被替換成為2+1*2+1,這肯定不是你想要的,所以對於巨集定義的函式最好都加上括號,並且每一個元素都加上括號。並且注意在巨集定義的函式裡邊不要使用++或者--的運算子,會造成不好的後果。


巨集定義的函式並不適合定義比較大的函式,巨集定義的函式比較適合於定義那種函式體比較小的函式,比如max,min之類的函式,一般只有一兩行。


#undef就是把巨集定義給取消掉。


##以及可變巨集的使用:


##是巨集定義的粘合劑,據一個例子大家就知道了,例如  #define S(N)  a##N就代表在接下來的程式碼裡邊如果定義一個變數,int S(1)就等同於定義int a1;


可變巨集就像printf的可變引數一樣,據一個例子就是  #define PR(...) printf(__VA_ARGS__),這樣子的話就是用__VA_ARGS__代替前邊的...。


#include的使用:


#include是c語言的前處理器指令的又一個很常用的指令。#include就代表把對應的檔案複製貼上到對應的位置一樣。


條件編譯的指令:


條件編譯在前處理器指令中也是十分常用的指令,#ifdef就是如果定義的意思,#else類似於c語言的else,#endif就是結束if,#ifndef就是如果沒有定義某個巨集,#elif就類似於c語言的else if,舉一個例子就是。


#ifndef A
#incldue "A.h"
#elif defined(B)
#include "B.h"
#endif
就是代表如果巨集定義了A的話,就會加入a.h檔案,如果定義了B的話,就會加入B。h檔案。


預定義巨集的使用:


預定義巨集是c語言一開始就定義好的幾個巨集,介紹下:
__DATE__代表當前日期
__FILE__代表當前原始檔
__TIME__代表當前時間
舉一個例子說明,
int main(int argc,char *args[])
{
    printf("%s\n",__DATE__);
    printf("%s\n",__FILE__);
    printf("%s\n",__TIME__);
    return 0;
}
輸出結果:
Jan  6 2014
E:\unniversity\c-c++\practice\c++test\main.cpp
22:37:05


其他的一些巨集定義指令:


#progma指令可以用於在程式碼裡邊修改編譯器的一些設定,比如#progma c9x on就可以設定編譯起是c99支援的。