定義全局變量的方法以及UIKIT_EXTERN簡單理解


一、定義全局變量:

創建類文件

在.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修飾的方法或變量庫外仍可見的屬性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM