usr/include
#空指令画饥,無(wú)任何效果
#include 包含一個(gè)源代碼文件
#define 定義宏
#undef 取消已定義的宏
#if 如果給定條件為真,則編譯下面代碼
#ifdef 如果宏已經(jīng)定義,則編譯下面代碼
#ifndef 如果宏沒有定義,則編譯下面代碼
#elif 如果前面的#if給定條件不為真,當(dāng)前條件為真祝拯,則編譯下面代碼
#endif 結(jié)束一個(gè)#if……#else條件編譯塊
#error 停止編譯并顯示錯(cuò)誤信息
資料來源:http://blog.csdn.net/wwwang89123/article/details/17436577
#define 是預(yù)處理命令,在編譯預(yù)處理時(shí)進(jìn)行簡(jiǎn)單的替換她肯,不作正確性檢查
typedef 是編譯時(shí)處理佳头,在自己的作用域內(nèi)給一個(gè)已經(jīng)存在的類型一個(gè)別名
宏定義只是簡(jiǎn)單的字符串代換(原地?cái)U(kuò)展)鹰贵,而typedef則不是原地?cái)U(kuò)展,它的新名字具有一定的封裝性康嘉,以致于新命名的標(biāo)識(shí)符具有更易定義變量的功能砾莱。請(qǐng)看上面第一大點(diǎn)代碼的第三行:
typedef??? (int*)????? pINT;以及下面這行:#define??? pINT2?? int*
效果相同?實(shí)則不同凄鼻!實(shí)踐中見差別:pINT a,b;的效果同int *a; int *b;表示定義了兩個(gè)整型指針變量。而pINT2 a,b;的效果同int *a, b;表示定義了一個(gè)整型指針變量a和整型變量b聚假。
注意:兩者還有一個(gè)行尾;號(hào)的區(qū)別哦块蚌!
宏的高級(jí)使用
1)__VA_ARGS__:總體來說就是將左邊宏中 ... 的內(nèi)容原樣抄寫在右邊 __VA_ARGS__ 所在的位置。它是一個(gè)可變參數(shù)的宏膘格,是新的C99規(guī)范中新增的峭范,目前似乎只有g(shù)cc支持(VC從VC2005開始支持)。要注意的是瘪贱,printf 的輸出格式是括號(hào)內(nèi)左邊是字符串纱控,右邊是變量,而且右變量與左輸出格式是一一對(duì)應(yīng)的菜秦。
2) __FILE__ :宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的源文件名
3) __LINE__:宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的行號(hào)
4) __FUNCTION__:宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的函數(shù)名稱
PS:編譯過程:
1甜害,掃描解析文件
2,預(yù)處理(宏在此時(shí)處理球昨,該替換的文字會(huì)被替換)
3尔店,對(duì)處理過的源代碼進(jìn)行匯編,輸出匯編語(yǔ)言的代碼(C語(yǔ)言的控制流程被處理)
4主慰,編譯為二進(jìn)制目標(biāo)文件
5嚣州,與程序庫(kù)進(jìn)行鏈接,輸出最終的程序文件
(宏 和 C語(yǔ)言在不同的階段處理執(zhí)行)
參考官方:http://gcc.gnu.org/onlinedocs/cpp/Macros.html#Macros
在宏定義中共螺,如果要換行该肴,使用“\"符號(hào)。然后經(jīng)預(yù)處理后還是在同一行藐不。
使用"##"操作符可以實(shí)現(xiàn)宏中token的連接匀哄。
資料來源:http://blog.csdn.net/songrotek/article/details/8929963