查看SDK源文件
#ifdef __cplusplus
#define UIKIT_EXTERN extern "C" __attribute__((visibility ("default")))
#else
#define UIKIT_EXTERN extern __attribute__((visibility ("default")))
#endif
用途
一般用于全局變量的定義(objective-c)
在.h文件中定義全局變量
#import <UIKit/UIKit.h>
UIKIT_EXTERN CGFloat const titleSize;
而在.m文件中一般這樣定義
#import <UIKit/UIKit.h>
CGFloat const titleSize = 25.0;
解釋
-
extern"C"是為了兼容以前的C程序, 告訴編譯器按照以前C編譯方式對(duì)(全局)函數(shù)或變量進(jìn)行編譯, 否則按照c++方式進(jìn)行編譯[1]。
例如: 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文件)
-
attribute 是設(shè)置函數(shù)屬性(或者變量屬性, 類型屬性), 可以設(shè)置的屬性包括:
packed,cleanup, common,nocommon,deprecated,mode,section,shared,tls_model,transparent_union等
visibility屬性是設(shè)置將本項(xiàng)目的函數(shù)作為庫使用時(shí)的可見性。g++編譯時(shí), 加入-fvisibility=hidden參數(shù), 會(huì)將所有默認(rèn)public屬性設(shè)為hidden, 導(dǎo)致庫外文件不可見
- 但是如果設(shè)置了attribute((visibility ("default")))的函數(shù), 其public屬性仍能對(duì)外可見, 而不是
hidden??梢娋幾g指令-fvisibility是對(duì)所有屬性符號(hào)進(jìn)行處理, 而attribute((visibility ("default")))是對(duì)特定函數(shù)可見性進(jìn)行設(shè)置, 避免沖突[3]。 -
static關(guān)鍵字修飾函數(shù)表示這是一個(gè)本地函數(shù), 不能被沒有保護(hù)該文件(對(duì)該文件具有可見性的其他文件)引用、鏈接,編譯階段就能強(qiáng)制檢查
5. UIKIT_EXTERN簡單來說:就是將函數(shù)修飾為兼容以往C編譯方式的、具有extern屬性(文件外可見性)、public修飾的方法或變量庫外仍可見的屬性