Case:外部模塊有一個(gè)函數(shù)fb_test,當(dāng)有外部模塊時(shí)調(diào)用fb_test,沒(méi)有外部模塊時(shí)不調(diào)用
// 沒(méi)有模塊FB的時(shí)候,只extern聲明模塊FB的函數(shù)fb_test,不調(diào)用是可以的,調(diào)用的話會(huì)報(bào)錯(cuò)符號(hào)找不到
extern void fb_test(void);
// 宏定義只適用于模塊內(nèi),不能跨模塊
//#ifdef B_H
// NSLog(@"包含");
//#else
// NSLog(@"不包含");
//#endif
// __has_include是檢測(cè)工程中是否包含某個(gè)頭文件,注意:工程中存在的文件不一定被引用了。常用來(lái)防止頭文件循環(huán)導(dǎo)入
#if __has_include("FB/B.h")
NSLog(@"包含");
fb_test();
#else
NSLog(@"不包含");
#endif
// 弱符號(hào):據(jù)網(wǎng)上介紹鏈接器發(fā)現(xiàn)同時(shí)存在弱符號(hào)和強(qiáng)符號(hào),優(yōu)先選擇強(qiáng)符號(hào),如果發(fā)現(xiàn)不存在強(qiáng)符號(hào),只存在弱符號(hào),則選擇弱符號(hào)。據(jù)自己測(cè)試:跨模塊場(chǎng)景下優(yōu)先選擇了本模塊,strong和weak設(shè)置無(wú)效
void __attribute__((weak)) fb_test(void) {
printf("weak:%s\n",__func__);
}
綜上所述:extern+__has_include即可。注意增刪framework要clean才能build生效。