UIKIT_EXTERN
//UIKitDefines.h
#ifdef __cplusplus
#define UIKIT_EXTERN extern "C" __attribute__((visibility ("default")))
#else
#define UIKIT_EXTERN extern __attribute__((visibility ("default")))
#endif
其中__cplusplus 是cpp中的自定義宏猛们,那么定義了這個宏的話表示這是一段cpp的代碼,也就是說棚贾,上面的代碼的含義是:如果這是一段cpp的代碼窖维,那么加入extern"C"和其中的代碼。
extern是C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字妙痹,該關(guān)鍵字告訴編譯器铸史,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。
extern "C"是為了兼容以前的 C程序, 告訴編譯器按照以前C編譯方式對(全局)函數(shù)或變量進行編譯, 否則按照c++方式進行編譯怯伊。
-
__attribute __是設(shè)置函數(shù)屬性(或者變量屬性, 類型屬性)琳轿,用法為__attribute __ ((attribute-list)), 可以設(shè)置的屬性包括:
packed,cleanup, common,nocommon,deprecated崭篡,mode挪哄,section,shared媚送,tls_model中燥,transparent_union等.
當項目需要作為一個庫被外包引用的時候通常在編譯時可以用參數(shù)-fvisibility指定所有符號的可見性。在編譯命令中加入 -fvisibility=hidden參數(shù)塘偎,會將所有默認的public的屬性變?yōu)閔idden疗涉。
此時,如果對函數(shù)設(shè)置attribute((visibility ("default")))參數(shù)吟秩,使特定的函數(shù)仍然按默認的public屬性處理咱扣,則-fvisibility=hidden參數(shù)不會對該函數(shù)起作用。所以涵防,設(shè)置了-fvisibility=hidden參數(shù)之后闹伪,只有設(shè)置了attribute((visibility ("default")))的函數(shù)才是對外可見的。
如果需要讓類或方法可以讓庫外被引用壮池,就需要使用以上代碼確保代碼的可見性偏瓤。
總結(jié)
UIKIT_EXTERN簡單來說:就是將函數(shù)修飾為兼容以往C編譯方式的、具有extern屬性(文件外可見性)椰憋、public修飾的方法或變量庫外仍可見的屬性