关于FOUNDATION_EXTERN、extern、FOUNDATION_EXPORT、extern "C"的区别

本文探讨了在Xcode编译环境下,FOUNDATION_EXPORT、FOUNDATION_EXTERN、extern以及extern "C"四种声明方式的区别。FOUNDATION_EXTERN被设计为C++兼容的extern宏,而extern "C"用于解决C++中的名称修饰问题。当项目涉及C++编程时,推荐使用FOUNDATION_EXPORT和FOUNDATION_IMPORT,否则可以使用FOUNDATION_EXTERN或extern。文章引用了相关博客链接以供深入理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家都知道Xcode的编译器是能够识别C++语言编程代码的,所以在编程中也是要考虑到C++的

首先直接上代码看一下几种宏的定义

#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif

由以上定义可以看出 FOUNDATION_EXTERN 是可以兼容C++的extern的宏。同样也可以推测出 extern "C" 也就是用来兼容C++里面的extetrn 的


#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

以上的定义看出

FOUNDATION_EXPORT

FOUNDATION_IMPORT

这两个是用来兼容win32应用程序的,当然这个宏我们在iOS编程中一般是很少用到的

FOUNDATION_EXPORT

FOUNDATION_IMPORT

为什么要定义的两个呢,可以看出来还是为了兼容C++的编程,因为在C++的编程中是存在两种定义的

__declspec(dllexport)

__declspec(dllimport)

至于两者的区别可以参考

 http://www.cnblogs.com/ylhome/archive/2010/07/10/1774770.html

http://blog.chinaunix.net/uid-25958655-id-4193134.html


总结:

综上可以看出,如果项目中涉及到使用C++语言的编程的话则最好使用

FOUNDATION_EXPORT

FOUNDATION_IMPORT

否则 使用

FOUNDATION_EXTERN 这个就可以了

当然使用extern 也是没有问题的,就看大家的需求了

另外这是stackoverflow 上关于话题 

“FOUNDATION_EXPORT” vs “extern” 的回答


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值