一、定義全局變量:
創建類文件
在.h中:
1 #import <UIKit/UIKit.h> 2 3 UIKIT_EXTERN CGFloat const ZWTitlesViewH; 4 UIKIT_EXTERN CGFloat const ZWTitlesViewY;
在.m中:
1 #import <UIKit/UIKit.h> 2 CGFloat const ZWTitlesViewH = 35; 3 CGFloat const ZWTitlesViewY = 64;
再創建一個pch文件,導入上面類的頭文件
注意:創建pch文件需要在Target/Build Setting/Prefix Header下設置pch的路徑,只需要當前工程內部路徑。
二、UIKIT_EXTERN的基本理解:
查看源文件:
1 #ifdef __cplusplus 2 #define UIKIT_EXTERN extern "C" __attribute__((visibility ("default"))) 3 #else 4 #define UIKIT_EXTERN extern __attribute__((visibility ("default"))) 5 #endif
line1: #ifdef __cplusplus, 說的是如果定義了 __cplusplus宏標識符, 則定義后面的內容(line2), 否則定義#else里面的內容(line4)
line2: #define UIKIT_EXTERN extern "C" __attribute__((visibility ("default"))),
1. extern "C"是為了兼容以前的 C程序, 告訴編譯器按照以前C編譯方式對(全局)函數或變量進行編譯, 否則按照c++方式進行編譯[1]。
eg. C方式編譯函數extern void fx(int , int), 不對函數名進行特殊處理編譯后函數名為_fx(.obj文件中)
但是C++方式編譯后, (為了支持重載)fx函數變成類似於_fx_int_int這樣的函數名, fx(int , float)會編譯成_fx_int_float (.obj文件)
2. __attribute__ 是設置函數屬性(或者變量屬性, 類型屬性), 可以設置的屬性包括:
packed,cleanup, common,nocommon,deprecated,mode,section,shared,tls_model,transparent_union等
visibility屬性是設置將本項目的函數作為庫使用時的可見性。g++編譯時, 加入-fvisibility=hidden參數, 會將所有默認public屬性設為hidden, 導致庫外文件不可見
3. 但是如果設置了__attribute__((visibility ("default")))的函數, 其public屬性仍能對外可見, 而不是hidden。可見編譯指令 -fvisibility是對所有屬性符號進行處理, 而__attribute__((visibility ("default")))是對特定函數可見性進行設置, 避免沖突[3]。
line3~6:忽略
line7:#define UIKIT_STATIC_INLINE static inline, 靜態內聯
static 關鍵字修飾函數表示這是一個本地函數, 不能被沒有保護該文件(對該文件具有可見性的其他文件)引用、鏈接,編譯階段就能強制檢查
inline 關鍵字表示建議編譯器將該函數作為一個內聯函數,將函數內的代碼直接嵌入到每一個引用處,有點類似於宏定義直接替換,但是卻包含了編譯器嚴格的類型檢查,所以比宏定義安全,卻又有同樣的執行速度。
UIKIT_EXTERN簡單來說:就是將函數修飾為兼容以往C編譯方式的、具有extern屬性(文件外可見性)、public修飾的方法或變量庫外仍可見的屬性
