轉(zhuǎn)載自 https://blog.csdn.net/farsight2009/article/details/58602886
姓名:張艷博 學號:17021223249
【嵌牛導(dǎo)讀】: C語言中常用預(yù)處理指令介紹
【嵌牛鼻子】: C語言? 預(yù)處理? 條件編譯
【嵌牛提問】: 怎樣了解C語言中常用預(yù)處理指令
【嵌牛正文】:
預(yù)處理:對一些預(yù)處理命令進行執(zhí)行的過程 預(yù)處理命令:頭文件包含;宏定義等,用#開頭的一些命令。 在C語言中預(yù)處理命令不會直接被編譯匾寝,而是在編譯這些預(yù)處理命令時,將這些預(yù)處理命令進行解析斟或,然后將預(yù)處理結(jié)果替換成真正的C語言能編譯的C語句。 如: #define PI 3.14 在編譯之前集嵌,預(yù)處理命令define會自動將程序中所有的PI替換成3.14.在編譯時程序中是不會在存在預(yù)處理命令的萝挤。
一)宏定義 (1)不帶參數(shù)的宏定義 如: #define PI 3.14 ①可以用宏定義來定義一個常量來設(shè)置一個數(shù)組的長度 #define arrr_len 100 int a[arrr_len] ②宏定義只是簡單的替換,而不做正確性的檢查纸淮,如果有#define 3.l4中的‘1’寫成‘l’也不會報錯平斩,他只是簡單的替換 如:#define N 3; 他就會將N替換成“3;”包括分號,因為宏定義咽块,會將符號常量的任何東西都將看成一個字符串并替換掉 ③通常宏定義出現(xiàn)在程序的開頭绘面,這個宏定義的作用域是本源文件。 ④如果想要解除宏定義的作用域侈沪,就在你需要解除的地方加上: #undef XXX ⑤宏定義可以在定義的時候就層層替換 如: #define PI 3.14 #define R 5; #define L 2*PI*R 注意:在宏定義的時候只是將這個看成字符串揭璃,做簡單的替換,而不會做運算亭罪。 ⑥ 在程序中如果在字符串中出現(xiàn)與宏名一樣的字符瘦馍,不會做替換 如: #define L = 2*3.14 Printf(“L=%d”,L); (2)帶參數(shù)的宏定義 (1)#define s(a,b) a*b S(2,3)替換成 2*3 (2) #define PI 3.14 #define S(r) PI*(r)*(r) 程序中:S(2+3) 替換成 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); 等價于 printf(“%d” “%d” “\n”,5,6)等價printf(“%d%d\n”,5应役,6)
二) 頭文件包含 #include 或者 #include “xxxx.h” 頭文件包含的使用方式: ①可以將多文件編程的所有頭文件專門寫入一個文件情组,然后在每一個文件中引用這個文件即可燥筷。 ② 專門在一個文件中將所有類型的printf利用宏定義表示,只需要在每一個文件中引入這個頭文件即可院崇。 注意: ①如果在文件1要包含文件2肆氓,而文件2要用到文件3;而文件2只是被文件1包含時,只需要在文件1中包含文件2和文件3底瓣,并且文件3的包含在文件2的前面谢揪。 ②文件1包含文件2,文件2包含文件3捐凭,只需要在相應(yīng)的文件中包含該文件即可拨扶。 ③ 如果包含的頭文件不再當前目錄中,就需要指定路徑 #include “D:\works\daima\farmat.h”
三) 條件編譯 定義:在C源碼中茁肠,基本上所有的代碼都要參與編譯的過程患民,編譯也是耗費時間的過程,因此我們在編譯大量的C源碼時官套,可以根據(jù)需要對一些源碼進行編譯 #define 標識符 1 #ifdef 標識符 程序段1; #else 程序段2; #endif (紅色的部分是可選部分酒奶,是可以省略的) 作用:如果ifdef后面的標識符是被#define定義過蚁孔,則程序段1將會被編譯奶赔,否則程序段2將會被編譯。 例子: #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; } 注意:#define int_32這個宏杠氢,后面可以是任意的字符站刑,符號”前伲或者什么都沒有绞旅。 #define 標識符 #ifndef 標識符 程序段1; #else 程序段2; #endif (紅色的部分是可選部分,是可以省略的) (1) #if 表常量達式 程序段1; #else 程序段2; #endif (紅色的部分是可選部分温艇,是可以省略的) (2)嵌套 #if 表常量達式1 程序段1; #else #if 表常量達式2 程序段2; #else 程序段3; #endif #endif (5)#if 表常量達式1 語句段1; #elif 表常量達式2 語句段2; #elif 表常量達式3 語句段3 #else 語句段4 #endif 四)C語言的內(nèi)嵌宏 C語言的內(nèi)嵌宏 C語言的內(nèi)嵌宏 __DATE__ :編譯器當前編譯此源文件的日期 __FILE__:當前源文件的文件名 __LINE__:當前語句所在代碼的行號(調(diào)試很重要) __func__當前語句所在源碼的哪一個函數(shù)中