Case:外部模块有一个函数fb_test,当有外部模块时调用fb_test,没有外部模块时不调用
// 没有模块FB的时候,只extern声明模块FB的函数fb_test,不调用是可以的,调用的话会报错符号找不到
extern void fb_test(void);
// 宏定义只适用于模块内,不能跨模块
//#ifdef B_H
// NSLog(@"包含");
//#else
// NSLog(@"不包含");
//#endif
// __has_include是检测工程中是否包含某个头文件,注意:工程中存在的文件不一定被引用了。常用来防止头文件循环导入
#if __has_include("FB/B.h")
NSLog(@"包含");
fb_test();
#else
NSLog(@"不包含");
#endif
// 弱符号:据网上介绍链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。据自己测试:跨模块场景下优先选择了本模块,strong和weak设置无效
void __attribute__((weak)) fb_test(void) {
printf("weak:%s\n",__func__);
}
综上所述:extern+__has_include
即可。注意增删framework要clean才能build生效。
网友评论