UIKIT_EXTERN的基本理解

查看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;

解釋

  1. 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文件)

  1. 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)致庫外文件不可見

  1. 但是如果設(shè)置了attribute((visibility ("default")))的函數(shù), 其public屬性仍能對(duì)外可見, 而不是hidden??梢娋幾g指令 -fvisibility是對(duì)所有屬性符號(hào)進(jìn)行處理, 而attribute((visibility ("default")))是對(duì)特定函數(shù)可見性進(jìn)行設(shè)置, 避免沖突[3]。
  2. static 關(guān)鍵字修飾函數(shù)表示這是一個(gè)本地函數(shù), 不能被沒有保護(hù)該文件(對(duì)該文件具有可見性的其他文件)引用、鏈接,編譯階段就能強(qiáng)制檢查
    5. UIKIT_EXTERN簡單來說:就是將函數(shù)修飾為兼容以往C編譯方式的、具有extern屬性(文件外可見性)、public修飾的方法或變量庫外仍可見的屬性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容