C語言中(zhong)常用(yong)預處(chu)理指令(ling)
時間:2018-09-27 來源:未知
預(yu)(yu)處理(li):對一些預(yu)(yu)處理(li)命令進(jin)行(xing)執行(xing)的過(guo)程
預(yu)處(chu)理命令:頭(tou)(tou)文件包含;宏定義(yi)等,用#開頭(tou)(tou)的一些命令。
本文引用地址://fsbing.cn/emb/Column/7467.html
在C語言(yan)中預(yu)處理(li)命令不會直接(jie)被編(bian)譯(yi),而是在編(bian)譯(yi)這些(xie)預(yu)處理(li)命令時,將這些(xie)預(yu)處理(li)命令進行解析,然后(hou)將預(yu)處理(li)結果替換成真正的(de)C語言(yan)能編(bian)譯(yi)的(de)C語句。
如(ru): #define PI 3.14
在(zai)編譯之前,預處理命令define會(hui)自動將(jiang)程序中(zhong)所有的PI替換成(cheng)3.14.在(zai)編譯時程序中(zhong)是(shi)不(bu)會(hui)在(zai)存在(zai)預處理命令的。
一)宏定義
(1)不帶參數的宏定義 如: #define PI 3.14
①可以用(yong)宏(hong)定義(yi)來(lai)定義(yi)一(yi)(yi)個常(chang)量(liang)來(lai)設置一(yi)(yi)個數組的長度
#define arrr_len 100 int a[arrr_len]
②宏定義(yi)只是(shi)簡(jian)單的替換,而不做(zuo)正(zheng)確(que)性的檢查,如(ru)果(guo)有(you)#define 3.l4中的‘1’寫成‘l’也不會(hui)報錯(cuo),他(ta)只是(shi)簡(jian)單的替換
如(ru):#define N 3; 他(ta)就會(hui)將(jiang)(jiang)N替換成(cheng)“3;”包括分號,因為宏定義,會(hui)將(jiang)(jiang)符(fu)(fu)號常量的任何(he)東西都將(jiang)(jiang)看成(cheng)一(yi)個字符(fu)(fu)串并(bing)替換掉
③通(tong)常宏定義出現在程(cheng)序的開(kai)頭,這個宏定義的作(zuo)用域是本源文件。
④如果想要(yao)解除(chu)宏定義的(de)作用域,就在你需要(yao)解除(chu)的(de)地方加上: #undef XXX
⑤宏(hong)定義可以在(zai)定義的時候就(jiu)層層替換
如(ru): #define PI 3.14
#define R 5;
#define L 2*PI*R
注意:在宏定義的時候只是將這個看成字(zi)符串,做(zuo)簡單的替換,而不會做(zuo)運算(suan)。
⑥ 在程序(xu)中(zhong)如(ru)果(guo)在字符(fu)串中(zhong)出現與宏(hong)名一樣的字符(fu),不會做替換
如: #define L = 2*3.14
Printf(“L=%d”,L);
(2)帶參數的宏定義
(1)#define s(a,b) a*b
S(2,3)替換成 2*3
(2) #define PI 3.14
#define S(r) PI*(r)*(r)
程序(xu)中:S(2+3) 替換成(cheng) 3.14*2*2
(3) #define PI 3.14
#define S(r) PI*r*r
則s(2+3)可以替換成: 3.14*2+3*2+3
(4) (4)#define PI 3.14
#define S(r) PI*(r)*(r)
則s(2+3)可以替換成: 3.14*(2+3)*(2+3)
(5)#define D "%d"
#define D1 "\n"
#define D2 D D D1
printf(D2,5,6); 等(deng)價(jia)(jia)于(yu) printf(“%d” “%d” “\n”,5,6)等(deng)價(jia)(jia)printf(“%d%d\n”,5,6)
二) 頭文件包含
#include
頭文件包含的(de)使用方(fang)式:
①可(ke)以將多文(wen)(wen)(wen)件(jian)編程(cheng)的所有(you)頭文(wen)(wen)(wen)件(jian)專門寫入一(yi)(yi)個(ge)文(wen)(wen)(wen)件(jian),然后在每一(yi)(yi)個(ge)文(wen)(wen)(wen)件(jian)中引用這個(ge)文(wen)(wen)(wen)件(jian)即可(ke)。
② 專門在(zai)一(yi)個(ge)(ge)文(wen)件(jian)中(zhong)將所有(you)類型的printf利用宏定義表示,只(zhi)需要在(zai)每(mei)一(yi)個(ge)(ge)文(wen)件(jian)中(zhong)引入這(zhe)個(ge)(ge)頭文(wen)件(jian)即可(ke)。
注意:
①如(ru)果在(zai)文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)1要包含文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)2,而文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)2要用到(dao)文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)3;而文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)2只是被文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)1包含時(shi),只需要在(zai)文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)1中(zhong)包含文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)2和文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)3,并且文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)3的包含在(zai)文(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)2的前面。
②文件(jian)(jian)1包含文件(jian)(jian)2,文件(jian)(jian)2包含文件(jian)(jian)3,只需要在相應的文件(jian)(jian)中包含該文件(jian)(jian)即可。
③ 如果包(bao)含的頭文件不再當前目錄(lu)中,就需(xu)要(yao)指(zhi)定路徑
#include “D:\works\daima\farmat.h”
三) 條件編譯
定義:在C源(yuan)碼中,基本上所有的代碼都要(yao)參與(yu)編譯的過(guo)(guo)程(cheng),編譯也是耗費時(shi)間的過(guo)(guo)程(cheng),因此我們在編譯大量的C源(yuan)碼時(shi),可以(yi)根(gen)據需要(yao)對一些(xie)源(yuan)碼進行編譯
#define 標(biao)識符 1
#ifdef 標識符(fu)
程序段1;
#else
程序段2;
#endif
(紅色(se)的部(bu)分是可選部(bu)分,是可以省略的)
作用:如果ifdef后面的標識符(fu)是被#define定義過,則(ze)程(cheng)序(xu)段1將(jiang)會被編譯,否則(ze)程(cheng)序(xu)段2將(jiang)會被編譯。
例子:
#include
#define int_16
int main(int argc, char *argv[])
{
#ifdef int_32
printf("int is:32");
#else
printf("int is:16");
#endif
return 0;
}
注(zhu)意:#define int_32這個宏,后面可以是任意的字符(fu),符(fu)號(hao)。或者什(shen)么都(dou)沒(mei)有(you)。
#define 標識符
#ifndef 標識符
程序段1;
#else
程序段2;
#endif
(紅色的部分是可選部分,是可以省(sheng)略的)
(1)
#if 表常量(liang)達式
程序段1;
#else
程序段2;
#endif
(紅色的(de)部分是可選(xuan)部分,是可以省略的(de))
(2)嵌套
#if 表常量達式1
程序段1;
#else
#if 表常量達式2
程序段2;
#else
程序段3;
#endif
#endif
(5)#if 表常量(liang)達式1
語句段1;
#elif 表(biao)常量達式2
語句段2;
#elif 表(biao)常量達式3
語句段3
#else
語句段4
#endif
四)C語言的內嵌宏


__DATE__ :編譯器當(dang)前(qian)編譯此源(yuan)文件的(de)日期(qi)
__FILE__:當前(qian)源文(wen)(wen)件(jian)的文(wen)(wen)件(jian)名
__LINE__:當(dang)前(qian)語(yu)句所在代碼的行(xing)號(hao)(調試很重要(yao))
__func__當前語句所在源(yuan)碼(ma)的哪一個函數中

