宏定義#define:
定義和使用同C
/ :表示換行
# :字符串操作符谒拴,用于將參數(shù)序列化成一個(gè)字符串;
## :連接符涉波,用于將相鄰的兩個(gè)標(biāo)記(Token)連接為一個(gè)英上。使用是分隔(根據(jù)空格或其他操作分隔符[+,-,*,/,”,”等]),再?gòu)?qiáng)制連接(去掉和前面的字符串間的空格啤覆,再連接起來(lái))苍日。
@# :字符化操作符,只能用于有參數(shù)傳入的宏定義中窗声,必須置于宏定義體參數(shù)名前相恃,作用是將傳入的單字符參數(shù)名轉(zhuǎn)換成字符,以一對(duì)單引號(hào)括起來(lái)笨觅。
可變參數(shù)宏:#define DBGMSG(format, ...) fprintf (stderr, format, __VA_ARGS__)
… 表示一個(gè)可變化的參數(shù)表拦耐,變參必須放于最后一個(gè)參數(shù)耕腾;
__VA_ARGS__:參數(shù)標(biāo)識(shí)符。調(diào)用時(shí)會(huì)替代函數(shù)形參里的最后一個(gè)變參杀糯;
#pragma:說(shuō)明編譯器信息
_Pragma:同#pragma扫俺,但功能更強(qiáng)大;
#warning:顯示編譯警告信息
#error:顯示編譯錯(cuò)誤信息
#line:標(biāo)志該語(yǔ)言的行號(hào)
【可變參數(shù)宏不被ANSI/ISO C++所支持固翰,iOS支持】
C語(yǔ)言中預(yù)定義宏:
__FILE__ :當(dāng)前源代碼的文件名(字符串)
__LINE__:當(dāng)前源代碼中的行號(hào)(整型)
__DATE__:進(jìn)行預(yù)處理的日期(”Mmm dd yyyy”形式的字符串)
__TIME__:源文件編譯時(shí)間(格式“hh:mm:ss”)
__FUNCTION__:同__func__(但I(xiàn)DE不支持)狼纬,當(dāng)前源代碼的函數(shù)名
__PRETTY_FUNCTION__:同__FUNCITON__,但在g++下會(huì)輸類名倦挂、函數(shù)名及其他函數(shù)信息
例:
#ifdef __OBJC__ //表示下面定義的宏內(nèi)容只被使用Oc語(yǔ)言的文件所引用
#ifdef DEBUG
//debug環(huán)境畸颅,在調(diào)用NSLog后,自動(dòng)將參數(shù)拼接后再使用系統(tǒng)的NSLog打印
#define NSLog(str, ...) NSLog(@"%s(%d): " str, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define NSLog(...) {}//正式環(huán)境方援,調(diào)用到NSLog后没炒,不做操作
#endif
#define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); };
//在執(zhí)行block前判空,若一個(gè)空的block執(zhí)行,會(huì)出現(xiàn)EXEC_BAD_ACCESS異常
宏定義(define)與常量(const)的使用:
宏定義:#define NAME @“fansion” //只在預(yù)處理里做文本替換犯戏,沒(méi)有類型送火,不做類型檢查。大量使用宏會(huì)導(dǎo)致二進(jìn)制文件變大
變量:NSString *NAME = @“fansion”先匪;//共享一塊內(nèi)存空間种吸,若項(xiàng)目中N處用到,也不會(huì)分配N塊內(nèi)存空間呀非,可被修改坚俗,在編譯階段會(huì)檢查類型
常量:(四種方式)\共享一塊內(nèi)存空間
局部常量:static const NSString *NAME = @“fansion”;//用static修飾后外部不能訪問(wèn)
全局常量:不管在哪個(gè)文件夾,外部都能訪問(wèn)岸裙;
const NSString *NAME = @“fansion”;//*NAME不能被修改猖败,NAME可以
NSString const *NAME = @“fansion”;//*NAME不能被修改,NAME可以
NSString *const NAME = @“fansion”;//*NAME能被修改降允,NAME不可以
const位置不同恩闻,代表的意義不同;const只修飾右邊的內(nèi)容剧董,即右邊的內(nèi)容不能被修改幢尚。
【可認(rèn)為*是一個(gè)分界,把一個(gè)聲明從右向左讀翅楼。如:const char *p即:p is a pointer to a const char(常量字符)尉剩;char * const p即:p is a const pointer(常量指針) to a char】
博客地址:IOS基礎(chǔ)之宏定義