苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就能够在Objective-C利用过程中利用已有的C++类库。

Objective-C和C++混编的关键

在 Objective-C++中,能够用C++代码调用措施也能够从Objective-C调用措施。在这两种语言里对象都是指针,能够在任何地方利用。例如,C++类能够利用Objective-C对象的指针作为数据成员,Objective-C类也能够有C++对象指针做实例变量。下例解释了这一点。

当心:Xcode必需源文件以".mm"为伸展名,这么能力启用编译器的Objective-C++伸展。

#import

class Hello {

private:

id greeting_text; // holds an NSString

public:

Hello() {

greeting_text = @"Hello, world!";

}

Hello(const char* initial_greeting_text) {

greeting_text = [[NSString alloc] initWithUTF8String:initial_greeting_text];

}

void say_hello() {

printf("%s/n", [greeting_text UTF8String]);

}

};

@inte***ce Greeting : NSObject {

@private

Hello *hello;

}

- (id)init;

- (void)dealloc;

- (void)sayGreeting;

- (void)sayGreeting:(Hello*)greeting;

@end

@implementation Greeting

- (id)init {

if (immolation = [super init]) {

hello = new Hello();

}

return immolation;

}

- (void)dealloc {

delete hello;

[super dealloc];

}

- (void)sayGreeting {

hello->say_hello();

}

- (void)sayGreeting:(Hello*)greeting {

greeting->say_hello();

}

@end

int main() {

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

Greeting *greeting = [[Greeting alloc] init];

[greeting sayGreeting]; // > Hello, world!

Hello *hello = new Hello(xj.xjwmz.com"Bonjour, monde!");

[greeting sayGreeting:hello]; // > Bonjour, monde!

delete hello;

[greeting release];

[pool release];

return 0;

}

正如你能够在OC接口中声明C构造一样,你也能够在OC接口中声明C++类。跟C构造一样,OC接口中定义的C++类是大局范围的,不是OC类的内嵌类(这与规范C(尽管不是C++)晋级嵌套构造定义为文件范围是统一的)。

为了批准你基于语言变种条件化地编写代码,OC++编译器定义了__cplusplus和__OBJC__预处理器常量,离别指定C++和OC。如前所述,OC++不批准C++类继承自OC对象,也不批准OC类继承自C++对象。

class Base { };

@inte***ce ObjCClass: Base ... @end // ERROR!

class Derived: public ObjCClass ... // ERROR!

与 OC不同的是,C++对象是静态种类的,有运行时多态是特异情形。两种语言的对象模型因而不能直接接受。更大约的,OC和C++对象在内存中的格局是互不相容的,也即便说,等闲不可能创立一个对象实例从两种语言的角度来看都是管用的。因而,两种种类层次构造不能被混杂。

你能够在OC类内部声明C++类,编译器把这些类当作已声明在大局名目空间来看待。就像下面:

@inte***ce Foo {

class Bar { ... } // OK

}

@end

Bar *barPtr; // OK

OC批准C构造作为实例变量,不管它是否声明在OC声明内部。

@inte***ce Foo {

struct CStruct { ... };

struct CStruct bigIvar; // OK

} ... @end

Mac OS X 10.4尔后,万一你设置fobjc- call-cxx-cdtors编译器符号,你就能够利用包括虚函数和故含义的用户自定义零参数构造函数、析构函数的C++类实例来做为实例变量(gcc-4.2默认设置编译器符号fobjc-call-cpp-cdtors)。OC成员变量alloc完尔后,alloc函数会按声明次序调用构造器。构造器利用公共无参数稳妥的构造函数。OC成员变量dealloc之前,dealloc措施按声明次序反序调用调用析构函数。 OC没知名目空间得观念。不能在C++名目空间内部声明OC类,也不能在OC类里声明名目空间。

OC类,协议,分类不能声明在C++ template里,C++ template也不能声明在OC接口,协议,分类的范围内。

然而,OC类能够做C++ template的参数,C++ template参数也能够做OC消息表白式的空气压缩机接收者或参数(不能穿越selector)。

C++词汇歧义和抵触

OC头文件中定义了一些标识符,所有的OC过程定然包括的,这些标识符识id,Class,SEL,IMP和BOOL。

OC措施内,编译器预声明了标识符immolation和super,就想C++中的关键字this。跟C++的this不同的是,immolation和super是上下文相干的;OC措施外他们还能够用于等闲标识符。

协议内措施的参数列表,有5个上下文相干的关键字(oneway,in,out,inout,bycopy)。这些在其他内容中不是关键字。

从 OC过程员的角度来看,C++添置了不少新的关键字。你依旧能够利用C++的关键字做OC selector的一局部,因而波及并不严重,但你不能利用他们命名OC类和实例变量。例如,尽管class是C++的关键字,然而你依旧能够利用 NSObject的措施class:

[foo class]; // OK

然而,因为它是一个关键字,你不能用class做变量名目:

NSObject *class; // Error

OC里类名和分类名有独自的命名空间。@inte***ce foo和@inte***ce(foo)能够同时存在在一个源代码中。OC++里,你也能用C++中的类名或构造名来命名你的分类。

协议和template标识符利用语法雷同但目标不同:

id foo;TemplateType bar;

为了避免这种笼统之处,编译器不批准把id做template名目。最后,C++有一个语法歧义,当一个label后面跟了一个表白式表示一个大局名目时,就像下面:

label: ::global_name = 3;

第一个冒号后面必需空格。OC++有相仿情形,也必需一个空格:

receiver selector: ::global_c++_name;

局限

OC++ 未曾为OC类添置C++的功能,也未曾为C++类添置OC的功能。例如,你不能用OC语法调用C++对象,也不能为OC对象添置构造函数和析构函数,也不能将this和immolation互相轮换利用。类的系统构造是自力更生的。C++类不能继承OC类,OC类也不能继承C++类。另外,多语言失常处理是不扶持的。也就是说,一个OC抛出的失常不能被C++代码捉拿,反到来C++代码抛出的失常不能被OC代码捉拿。尤其是那些能够轻率在阅读代码的时候觉察的讹谬,这些讹谬经常不轻率穿越机器上的测验分辨出来。

Xcode中C、C++、Object-C3种语言的混编

转自: http://hi.baidu.com/onejw/item/f34390c997cdc226a1b50ae http://www.cocoachina.com/ask/questions/s ...

swift objective-及c语言 混编

在xocde6出来我们大部分代码都是用objective-c写的(部分C/C++),现在出生来了一个新的语言叫swift,那么如何既能使用我们之前的代码,还可以使用新语言呢, 本文就此做一下说明. 关 ...

IOS --- OC与Swift混编

swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. ...

【转】IOS --- OC与Swift混编

群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...

iOS开发--混编篇&swift与OC混合使用

Swift与OC混合使用 swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编. ...

OC与Swift混编

群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...

初探swift语言的学习—Object-C与Swift混编

swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. ...

详解 swift2.2 和 OC 的混编

前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...

详解Swift和OC的混编

前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...

随机推荐

sourceTreee设置忽略的文件

1.忽略不想要的目录,比如bin.obj目录(每次运行本机程序都会变化) 这个在右上角的Settings的Advanced下面的Repository-specific ignore list,点击Ed ...

starUML使用教程

starUML使用教程 下载与安装 先从官网下载软件,这个版本是收费的,但可以先进行试用.也可以使用免费版,基本UML依然齐全,但用起来感觉没有收费版好用. 下载之后按照安装说明,一步步安装就可以了. ...

HDU5806 NanoApe Loves Sequence Ⅱ (BestCoder Round #86 C)二分

分析:大于等于m的变成1,否则变成0,预处理前缀和,枚举起点,找到第一个点前缀和大于m即可 找第一个点可以二分可以尺取 #include #include

.net 安装Swagger

官网:http://swagger.io/ 教程:http://www.wmpratt.com/swagger-and-asp-net-web-api-part-1/ 1:安装Dll: https:/ ...

基于C++ 苹果apns消息推送实现(2)

1.该模块的用途C++ 和 Openssl 代码 它实现了一个简单的apns顾客 2.配套文件:基于boost 的苹果apns消息推送实现(1) 3.最初使用的sslv23/sslv2/sslv3仅仅 ...

QueryOver<T>

NHibernate 数据查询之QueryOver   一.限制运算符 Where:筛选序列中的项目WhereNot:反筛选序列中的项目 二.投影运算符 Select:创建部分序列的 ...

Django中使用geetest实现滑动验证

下载第三方模块 导入模块social-auth-app-django 和geetest 提前去官网下载gt.js或者引入http://static.geetest.com/static/tools/g ...

js数组的用法

1.数组 - - 添加元素 arr.push('abc')  向数组尾部添加元素,返回值为数组的长度 arr.unshift('abc')  向数组头部添加元素,返回值为数组的长度 2.数组 - - ...

移动端mobiscroll无法滑动、无法划动选值的问题

mobiscroll配置 theme: 'ios',时.滑动取值无效: html的页面内容稍微长过手机屏幕,页面无法完全加载,允许稍微滑动,这时导致点击选择mobiscroll值时无法滑动取值.处理: ...

MOBA游戏学会这些知识,你才算真的入门了!

是一个标准的MOBA游戏,MOBA指的是多人在线战术竞技游戏,游戏模式始于1998年中的一张自定义地图,经过近20年的优化和调整逐渐演变成了我们现 ...

oc语言和c语言,OC和C语言的混编注意点和好处相关推荐

  1. 小白学习记录篇01---C语言和C++的区别以及C语言中文件的含义(不足之处欢迎大佬补充提醒。)

    1.C语言和C++的对比 (1)创建文件的后缀名不同,如果创建C语言的文件通常以.c结尾,而C++通常以.cpp结尾. <1>这里就想要补充两个文件的概念,什么是.c文件?什么是.cpp文 ...

  2. Go语言和Java、python等其他语言的对比分析

    一.Go语言设计初衷 1.设计Go语言是为了解决当时Google开发遇到的问题: 大量的C++代码,同时又引入了Java和Python 成千上万的工程师 数以万计行的代码 分布式的编译系统 数百万的服 ...

  3. c语言和python区别,python和c语言的区别是什么

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

  4. oc语言和c语言,C语言及OC语言初期学习心得

    2015-7-22,周三 经过一个星期C语言的学习,对基础知识语法已经有了一定的了解和认识.同时通过这三天对OC语言的学习,更加了解编程语言都是相融相通的.虽然 OC语言的语法和之前接触的C,JAVA ...

  5. r语言和python-R VS Python:R语言是否真的过时了?

    ​自从CDA数据分析师开设了Level1 业务数据分析师 R专题之后,很多学生对此产生了疑惑.特别是在挖掘建模工具的选择上,甚至出现了选择恐惧症.在此,摘抄了 浩彬老撕 的文章,以及之前零零散散看的一 ...

  6. c语言和plc编程,PLC编程C语言.ppt

    PLC编程C语言 华中数控培训讲义 · PLC编程 C语言编程 PLC控制的范围 数控机床所受到的控制可分为两类:数字控制和顺序控制. 数字控制主要指对各进给轴进行精确的位置控制,包括:轴移 动距离. ...

  7. go语言和python结合_Go+Python双语言混合开发-第1章 【阶段一:Go语言基础】

    1-1 Go+Python双语言混合开发-课程导学 (11:35) 1-2 课程资源获取方式 - 非常重要!!! (06:07) 1-3 课程中需要用到的开发环境介绍 (03:47) 1-4 wind ...

  8. c语言和plc编程,PLC编程-C语言PPT学习课件

    华中数控培训讲义PLC编程,C语言编程,1,,PLC控制的范围,数控机床所受到的控制可分为两类:数字控制和顺序控制.数字控制主要指对各进给轴进行精确的位置控制,包括:轴移动距离.插补.补偿等.顺序控制 ...

  9. 易语言和python混合编程_易语言python交互源码,不需要把易语言编译成静态库

    .版本 2 .支持库 spec .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行 .局部变量 mothod, PyMethodDef .局部变量 创建结果, 整数型 .局部变量 错 ...

最新文章

  1. # 20145220《信息安全系统设计基础》第1周学习总结
  2. centos6.7一键装机
  3. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】
  4. 搭建SpringMVC+Hibernate4+Spring3+Ajax+Maven项目(二)
  5. 5分钟内看懂机器学习和深度学习的区别
  6. 为什么选择Dojo - 记Dojo中文博客正式开张
  7. HashSet存储自定义对象保证元素唯一性图解原理及代码优化
  8. 计算机主机配置有哪些,电脑主机配置清单有哪些 电脑主机配置清单及价格
  9. Matlab报错警告: 启动 Connector 时出现问题及解决方案
  10. 用python进行wifi密码生成
  11. 坐标系旋转前后坐标的变化
  12. 【图像融合】基于matlab高斯金字塔+拉普拉斯金字塔彩色水下图像融合【含Matlab源码 1629期】
  13. 计算机wmi配置错误,系统没有WMI服务怎么办、WMI错误修复方法
  14. VirtualBox简单使用
  15. 再战双十一,阿里这回真的“上天”了!
  16. 重要知识:身份证复印件的正确使用方法
  17. Github上开源仿京东商城项目启动配置详解(进阶版)
  18. 《安富莱嵌入式周报》第245期:2021.12.20--2021.12.26
  19. Chrome侧边栏书签插件 Candy Bookmarks Sidebar
  20. echart图表环形图(饼图)

热门文章

  1. 教你如何在win11家庭版中添加【本地安全策略】
  2. Java实现emf转jpg png 图片转换
  3. 骚操作!用 Python 远程控制 Windows 服务器,太好用了!
  4. 如何使用CocoaPods?
  5. TPS5430设计24v转15v电源 | 附参考电路和各元器件的选型
  6. c 配置mysql字符串_mysql字符串属性实例学习
  7. (二十)unity shader之——————基于物理的渲染技术(PBS):下篇(PBS技术拓展:全局光照、伽马校正、HDR)
  8. 1.Paper小结——《Privacy-Preserving Federated Learning in Fog Computing》
  9. RDD编程初级实践-课程论文
  10. 超出ipc连接数范围_NVR添加不上IPC,咋整?---大华篇