IOS UIKIT_EXTERN, __attribute__((visibility ("default"))) 是啥玩意?轉(zhuǎn)載(http://www.cnblogs.com/fortunely/p/4681635.html)
問題提出
在學(xué)習(xí)IOS時(shí)候挤安,碰到一個(gè)函數(shù)NSStringFromCGPoint (UIGeometry.h)
其原型是 UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point);
原型分析
NSString* , CGPoint好理解, 前者是庫自帶的字符串類型, 后者是一個(gè)表示2維平面上的點(diǎn)的結(jié)構(gòu)體辫秧。但是UIKIT_EXTERN是什么呢蓖救?
查找發(fā)現(xiàn)
UIKitDefines.h
1#ifdef__cplusplus2#defineUIKIT_EXTERN? ? ? ? extern "C" __attribute__((visibility ("default")))3#else4#defineUIKIT_EXTERN? ? ? ? ? ? extern __attribute__((visibility ("default")))5#endif67#defineUIKIT_STATIC_INLINE? ? static inline
下面一行一行來看
line1:#ifdef__cplusplus, 說的是如果定義了__cplusplus宏標(biāo)識(shí)符, 則定義后面的內(nèi)容(line2), 否則定義#else里面的內(nèi)容(line4)
line2:#defineUIKIT_EXTERN extern "C" __attribute__((visibility ("default"))),
1.extern "C"是為了兼容以前的 C程序, 告訴編譯器按照以前C編譯方式對(duì)(全局)函數(shù)或變量進(jìn)行編譯, 否則按照c++方式進(jìn)行編譯[1]磁餐。
eg. C方式編譯函數(shù)extern void fx(int , int), 不對(duì)函數(shù)名進(jìn)行特殊處理編譯后函數(shù)名為_fx(.obj文件中)
但是C++方式編譯后, (為了支持重載)fx函數(shù)變成類似于_fx_int_int這樣的函數(shù)名, fx(int , float)會(huì)編譯成_fx_int_float (.obj文件)
2. __attribute__ 是設(shè)置函數(shù)屬性(或者變量屬性, 類型屬性), 可以設(shè)置的屬性包括
1packed,cleanup, common句惯,nocommon拍嵌,deprecated,mode潜索,section臭增,shared,tls_model竹习,transparent_union等[2]
visibility屬性是設(shè)置將本項(xiàng)目的函數(shù)作為庫使用時(shí)的可見性誊抛。g++編譯時(shí), 加入-fvisibility=hidden參數(shù), 會(huì)將所有默認(rèn)public屬性設(shè)為hidden, 導(dǎo)致庫外文件不可見
3. 但是如果設(shè)置了__attribute__((visibility ("default")))的函數(shù), 其public屬性仍能對(duì)外可見, 而不是hidden≌埃可見編譯指令-fvisibility是對(duì)所有屬性符號(hào)進(jìn)行處理, 而__attribute__((visibility ("default")))是對(duì)特定函數(shù)可見性進(jìn)行設(shè)置, 避免沖突[3]拗窃。
line3~6:忽略
line7:#define UIKIT_STATIC_INLINE?? ?static inline, 靜態(tài)內(nèi)聯(lián)
static 關(guān)鍵字修飾函數(shù)表示這是一個(gè)本地函數(shù), 不能被沒有保護(hù)該文件(對(duì)該文件具有可見性的其他文件)引用、鏈接泌辫,編譯階段就能強(qiáng)制檢查
inline 關(guān)鍵字表示建議編譯器將該函數(shù)作為一個(gè)內(nèi)聯(lián)函數(shù)随夸,將函數(shù)內(nèi)的代碼直接嵌入到每一個(gè)引用處,有點(diǎn)類似于宏定義直接替換震放,但是卻包含了編譯器嚴(yán)格的類型檢查宾毒,所以比宏定義安全,卻又有同樣的執(zhí)行速度殿遂。
總結(jié)
UIKIT_EXTERN簡單來說诈铛,就是將函數(shù)修飾為兼容以往C編譯方式的乙各、具有extern屬性(文件外可見性)、public修飾的方法或變量庫外仍可見的屬性
參考
1
2
3[1] http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html
[2] http://blog.csdn.net/juana1/article/details/6849120
[3] http://blog.csdn.net/mrguanlingyu/article/details/23337885