转自简书:关于FOUNDATION_EXTERN、extern、FOUNDATION_EXPORT、extern "C"的区别

extern

在一个项目中必须保证函数、变量、枚举等在所有的源文件中保持一致,除非指定定义为局部的。

一个全局变量在所有的模块当中只能被声明一次,否则会出现链接错误。但是可以声明很多次,且声明必须保证类型一致。用 extern 声明时一个变量时,并不是定义一个变量,也不会为变量分配内存空间。

extern 是 c/c++ 语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数或变量可以在本模块或者其他模块中使用。通常,在模块的头文件中对本模块提供给其他模块使用的函数和全局变量以关键字 extern 声明。例如:如果模块 B 想要引用模块 A 中定义的全局变量和函数时,只包含模块 A 的头文件即可。这样,模块 B 调用模块 A 的函数时,在编译阶段,模块 B 虽然找不到该函数,但是并不会报错,它会在链接阶段中从模块 A 编译生成的目标代码中找到此函数。

extern 对应的关键字是 static。被 static 修饰的全局变量或函数,只能在本模块中使用。因此,一个函数或变量只能在本模块中使用时,不能够使用 extern 修饰。

extern "C"

一个 C++ 程序中可能包含其他语言编写的部分代码,同样,C++ 编写的代码片段也可能被用在其他语言编写的代码中。但是,不同语言编写的代码相互调用是困难的,更何况用同一种语言编写,使用不同编译器进行编译的情况。因为,不同语言或者同种语言在不同编译器上编译时,在注册变量,传递参数和参数在栈上的布局上可能存在差异。

为了使它们遵守统一规则,可以使用 extern 指定一个编译和链接规约。extern "C" 指令中的 C,表示的是一种编译和链接规约,而不是一种语言。C 表示符合 C 语言的编译和链接规约的任何语言。

还要说明的是,extern "C" 指令指定的编译和链接规约,不会影响语义,只是改变编译和链接的方式。
如果很很多语句要加上 extern "C",可以将它们放到 extern "C" {} 中。

FOUNDATION_EXTERN

Xcode 编译器可以识别 C 和 C++ 语言,所以在编程中也会考虑 C 和 C++ 语言的使用。
在 Xcode 中对 FOUNDATION_EXTERN 的定义如下:

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

由此可以看出 FOUNDATION_EXTERN 可以兼容 externextern "C"

FOUNDATION_EXPORT 和 FOUNDATION_IMPORT

在 Xcode 中 FOUNDATION_EXPORTFOUNDATION_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

以上定义可以看出:FOUNDATION_EXPORTFOUNDATION_IMPORT 这两个是用来兼容 win32 应用程序的,当然这两个宏在 iOS 编程中一般很少用到的。

FOUNDATION_EXPORTFOUNDATION_IMPORT 分别来兼容 C++ 编程中的 __declspec(dllexport)__declspec(dllimport)

  • __declspec(dllexport)
    声明一个导出函数,是说这个函数要从本 DLL 导出。
  • __declspec(dllimport)
    声明一个导入函数,是说这个函数是从别的DLL导入。

总结

如果项目中涉å及到使用 C++ 语言的编程则最好使用:FOUNDATION_EXPORTFOUNDATION_IMPORT
否则,使用 FOUNDATION_EXTERN 这个就可以了。当然使用 extern 也是没有问题的。
六、参考链接
http://www.itdadao.com/articles/c15a205742p0.html
http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html
http://blog.163.com/hbu_lijian/blog/static/1261291532013031101546987/

作者:fuyoufang
链接:https://www.jianshu.com/p/8f9d8a5c9e3b
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/jxst441192/p/10827480.html

时间: 2024-10-11 07:12:15

转自简书:关于FOUNDATION_EXTERN、extern、FOUNDATION_EXPORT、extern "C"的区别的相关文章

WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书

原文:WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书 最近项目中使用弹出控件Popup,发现弹出框的对齐方式在不同的系统中存在不同(Popup在win10上是弹出在左边,Win7上是弹出在右边).现在记录解决方案于此: 修改弹出菜单相对于相应菜单项是左对齐还是右对齐 // 解决Popup控件在Win7以及Win10等系统中的对齐点方式不一样的问题(以下两种方法均OK) using System.Reflection;    // 方法一 using Sy

【凯子哥带你学Android】Andriod性能优化之列表卡顿——以“简书”APP为例

这几天闲得无聊,就打开手机上的开发者模式里面的"GPU过度绘制"功能,看看别家的App做的咋样,然后很偶然的打开了"简书",然后就被它的过度绘制惊呆了,于是写了这篇性能分析的文章,从一个只有APK文件的角度,说下如何寻找布局中可能存在的性能问题,以及解决方案.本文章以简书Android最新版本1.9.1进行分析. GPU过度绘制 Hierarchy View SysTrace TraceView 总结 分析资源下载 GPU过度绘制 首先打开下面两个功能开关 开发者模

《信息安全技术》简书破密

wireshark网络捕获 今天的作业是用wireshark软件捕获网络 我就用它捕获了我登的简书登录账号跟密码,密码是假的,但账号跟错误的密码都捕获成功了. 首先打开软件,点开所用的网络类型,我的是WALN 然后打开网址登录网页,登陆账号 接下来找,因为我登的是http协议,所以可以在应用显示过滤器中输入hhttp.request.method==POET来节省时间 找到了,账号 错误的密码都捕获到了 真的好神奇!越来越对这些课感兴趣了.

如何用css实现类似简书的纵向导航/竖排导航

作为一个专注阅读的网站,它的导航也一定是全局的,固定的,也是简洁的.事实上几家阅读网站豆瓣阅读,多看,简书都是这样做的,刚好实现起来也不算复杂,以下是我想到的实现方法. 首先是html的结构: 1 <body> 2 <nav> 3 <div> 4 <a href="#">点</a> 5 <a href="#">滴</a> 6 <a href="#">一

iOS实现简书的账号识别方式(正则表达式)

通过简书iOS客户端登录,我们会看到请输入手机号或者邮箱登录,但是我们随机输入1234567的时候,便会弹出手机格式不正确,同样也会识别我们的邮箱格式,那么我们在项目中怎么实现这种判断呢? 0E471361-060C-4D93-913F-73622F89BC60.png 这就是我们今天要说的正则表达式. 正则表达式的介绍 正则表达式有多种使用方法,根据我们的需要,我们是要判断输入是否合法,还是查找指定的内容,还是捕获多个输入的内容,可以选用不同的方法,今天我们主要说一下,判断输入是否合法,用谓词

简书-markdown

标题 这是最为常用的格式,在平时常用的的文本编辑器中大多是这样实现的:输入文本.选中文本.设置标题格式. 如: # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 注:# 和「一级标题」之间建议保留一个字符的空格,这是最标准的 Markdown 写法. 你可以你的编辑器中尝试输入这六级标题,可以参考下方的截图: 一级标题至六级标题 列表 Markdown 中,只需要在文字前面加上 - 如: - 文本1 - 文本2 - 文本3 有序排列

转载:简书 vim环境配置 作者 fromradio 留作备忘 如侵权请联系删除

为Python创建Vim环境 作者 fromradio 2016.08.04 11:36* 字数 1766 阅读 504评论 0喜欢 12 大部分Python使用者可能习惯使用Sublime Text 3等笔记本式的编辑器.然而实际工作环境中有可能遇到需要在无GUI环境下工作的情况,比如需要登录到虚机上进行调试等.此时vim成为了常用的编辑器选择,所以如何使得vim变得心应手成为一个重要的问题. 第一个问题是vim版本的问题,笔者工作环境中的red hat 6版本的默认vim为7.2,不能支持后

Python 2.7_多进程获取简书专题数据(一)

学python几个月了正好练练手,发现问题不断提高,先从专题入手,爬取些数据,一开始对简书网站结构不熟悉,抓取推荐,热门,城市3个导航栏,交流发现推荐和热门是排序不同,url会重复,以及每个专题详情页三个类目最新评论,最新收录, 热门也会重复 做了下调整,代码执行完毕会返回所有专题的urls元组对象,以便下一步进入每个专题页面解析获取其他数据.注:变量focus关注数,和打开专题后最上面显示的专题关注人数会有差异,例如有的专题关注了10175人,在专题列表页会显示成"10.07k",因

[开源,学习,分享]UWP第三方简书客户端分享

简介 Windows10正式版发布到现在,我利用零零碎碎的一些时间对UWP进行一些学习,也基于这门技术开发了一个第三方的简书App. 基本界面 优酷视频: http://v.youku.com/v_show/id_XMTM2MjU4MjI4NA==.html 基本功能 客户端采用了UWP的技术,所以支持x86,x64,ARM平台,采用了响应式的布局.对手机进行了部分的优化. 对SQLite和本地存储进行了封装,支持缓存. 缓存支持同步和异步的两种方式,分别实现了两个接口: internal in