c語言前處理器指令
阿新 • • 發佈:2019-02-01
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支援的。
首先介紹什麼是前處理器,前處理器就是在程式的原始碼編譯之前,會對程式進行翻譯工作,就是把這程式\之後的回車去掉,以及去掉註釋,然後會把之間的空白自符去掉,然後再根據預處理指令把程式進行預處理操作,等著一切都進行完畢以後,就會進行編譯操作。
#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支援的。