前言:
日日擼碼狸驳,臣服于業(yè)務(wù)。以前看一些第三方庫(kù)缩赛,發(fā)現(xiàn)人家?guī)熘羞@么使用耙箍,沒(méi)有在意。突然發(fā)現(xiàn)公司大神也這樣寫(xiě)的代碼酥馍,一副沒(méi)見(jiàn)過(guò)世面的樣子辩昆,尷尬五分鐘、旨袒、汁针、、
發(fā)現(xiàn)自己真實(shí)low的一匹砚尽。趕快學(xué)習(xí)一下施无,還是被老夫挖掘出來(lái)一些好的文章,備以后查閱必孤。
FOUNDATION_EXTERN
#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif
總結(jié):
由以上定義可以看出
FOUNDATION_EXTERN
是可以兼容C++的extern
的宏猾骡。同樣也可以推測(cè)出extern "C"
也就是用來(lái)兼容C++里面的extetrn
的。
表示extern全局變量敷搪,此時(shí)并沒(méi)有分配內(nèi)存兴想,需要在.m文件中實(shí)現(xiàn)。
此時(shí)為了支持C和C++混編(__cplusplus
是C++編譯器內(nèi)部定義的宏购啄,在C++中襟企,需要加extern"C"
或包含在extern "C"
塊中)
注意,此時(shí)外界是可以修改這個(gè)值狮含。
用法:
//.h
FOUNDATION_EXPORT NSString * const kMyConstantString;
FOUNDATION_EXPORT NSString * const kMyConstantString2;
//.m
NSString * const kMyConstantString = @"Hello";
NSString * const kMyConstantString2 = @"World";
define
#define kMyConstantString @"Hello World"
FOUNDATION_EXTERN 和 define區(qū)別:
在檢測(cè)字符串的值是否相等的時(shí)候:
使用
FOUNDATION_EXTERN
更快,直接使用(stringInstance == MyFirstConstant
)來(lái)比較,
比較的是指針地址使用
define
稍慢顽悼,使用的是這種([stringInstance isEqualToString:MyFirstConstant]
)
比較字符串的每一個(gè)字符是否相等.
FOUNDATION_EXPORT && FOUNDATION_IMPORT
#if TARGET_OS_WIN32
#if defined(NSBUILDINGFOUNDATION)
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllexport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllimport)
#endif
#define FOUNDATION_IMPORT FOUNDATION_EXTERN __declspec(dllimport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN
#define FOUNDATION_IMPORT FOUNDATION_EXTERN
#endif
我們?cè)趇OS編程中一般是很少用到這兩個(gè)宏曼振,這兩個(gè)是用來(lái)兼容win32應(yīng)用程序的,
為了兼容C++的編程蔚龙,因?yàn)樵贑++的編程中是存在兩種定義的
__declspec(dllexport)
? ? ? ? ? ? ?
__declspec(dllimport)
dllexport和dllimport的區(qū)別請(qǐng)看參考文章中的詳細(xì)介紹
NSObjCRuntime.h中你不知道的宏
帶挖掘續(xù)寫(xiě).....
參考地址:
應(yīng)該使用FOUNDATION_EXPORT還是#define來(lái)定義常量?
c++ 中__declspec 的用法
NSObjCRuntime.h中你不知道的宏