查看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編譯方式對(全局)函數(shù)或變量進行編譯, 否則按照c++
方式進行編譯[1]拾给。
例如: C方式編譯函數(shù)extern void fx(int , int)
, 不對函數(shù)名進行特殊處理編譯后函數(shù)名為_fx
(.obj文件中)
但是C++
方式編譯后, (為了支持重載)fx
函數(shù)變成類似于_fx_int_int這樣的函數(shù)名, fx(int , float)
會編譯成_fx_int_float
(.obj文件)
-
attribute 是設(shè)置函數(shù)屬性(或者變量屬性, 類型屬性), 可以設(shè)置的屬性包括:
packed,cleanup, common早抠,nocommon,deprecated,mode璧瞬,section嗅绸,shared,tls_model断国,transparent_union
等
visibility
屬性是設(shè)置將本項目的函數(shù)作為庫使用時的可見性贤姆。g++編譯時, 加入-fvisibility=hidden
參數(shù), 會將所有默認public
屬性設(shè)為hidden
, 導(dǎo)致庫外文件不可見
- 但是如果設(shè)置了attribute((visibility ("default")))的函數(shù), 其public屬性仍能對外可見, 而不是
hidden
∥瘸模可見編譯指令-fvisibility
是對所有屬性符號進行處理, 而attribute((visibility ("default")))是對特定函數(shù)可見性進行設(shè)置, 避免沖突[3]霞捡。 -
static
關(guān)鍵字修飾函數(shù)表示這是一個本地函數(shù), 不能被沒有保護該文件(對該文件具有可見性的其他文件)引用、鏈接薄疚,編譯階段就能強制檢查
5. UIKIT_EXTERN簡單來說:就是將函數(shù)修飾為兼容以往C編譯方式的碧信、具有extern屬性(文件外可見性)、public修飾的方法或變量庫外仍可見的屬性