oc语言和c语言,OC和C语言的混编注意点和好处
苹果的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语言的混编注意点和好处相关推荐
- 小白学习记录篇01---C语言和C++的区别以及C语言中文件的含义(不足之处欢迎大佬补充提醒。)
1.C语言和C++的对比 (1)创建文件的后缀名不同,如果创建C语言的文件通常以.c结尾,而C++通常以.cpp结尾. <1>这里就想要补充两个文件的概念,什么是.c文件?什么是.cpp文 ...
- Go语言和Java、python等其他语言的对比分析
一.Go语言设计初衷 1.设计Go语言是为了解决当时Google开发遇到的问题: 大量的C++代码,同时又引入了Java和Python 成千上万的工程师 数以万计行的代码 分布式的编译系统 数百万的服 ...
- c语言和python区别,python和c语言的区别是什么
Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...
- oc语言和c语言,C语言及OC语言初期学习心得
2015-7-22,周三 经过一个星期C语言的学习,对基础知识语法已经有了一定的了解和认识.同时通过这三天对OC语言的学习,更加了解编程语言都是相融相通的.虽然 OC语言的语法和之前接触的C,JAVA ...
- r语言和python-R VS Python:R语言是否真的过时了?
自从CDA数据分析师开设了Level1 业务数据分析师 R专题之后,很多学生对此产生了疑惑.特别是在挖掘建模工具的选择上,甚至出现了选择恐惧症.在此,摘抄了 浩彬老撕 的文章,以及之前零零散散看的一 ...
- c语言和plc编程,PLC编程C语言.ppt
PLC编程C语言 华中数控培训讲义 · PLC编程 C语言编程 PLC控制的范围 数控机床所受到的控制可分为两类:数字控制和顺序控制. 数字控制主要指对各进给轴进行精确的位置控制,包括:轴移 动距离. ...
- go语言和python结合_Go+Python双语言混合开发-第1章 【阶段一:Go语言基础】
1-1 Go+Python双语言混合开发-课程导学 (11:35) 1-2 课程资源获取方式 - 非常重要!!! (06:07) 1-3 课程中需要用到的开发环境介绍 (03:47) 1-4 wind ...
- c语言和plc编程,PLC编程-C语言PPT学习课件
华中数控培训讲义PLC编程,C语言编程,1,,PLC控制的范围,数控机床所受到的控制可分为两类:数字控制和顺序控制.数字控制主要指对各进给轴进行精确的位置控制,包括:轴移动距离.插补.补偿等.顺序控制 ...
- 易语言和python混合编程_易语言python交互源码,不需要把易语言编译成静态库
.版本 2 .支持库 spec .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行 .局部变量 mothod, PyMethodDef .局部变量 创建结果, 整数型 .局部变量 错 ...
最新文章
- # 20145220《信息安全系统设计基础》第1周学习总结
- centos6.7一键装机
- JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】
- 搭建SpringMVC+Hibernate4+Spring3+Ajax+Maven项目(二)
- 5分钟内看懂机器学习和深度学习的区别
- 为什么选择Dojo - 记Dojo中文博客正式开张
- HashSet存储自定义对象保证元素唯一性图解原理及代码优化
- 计算机主机配置有哪些,电脑主机配置清单有哪些 电脑主机配置清单及价格
- Matlab报错警告: 启动 Connector 时出现问题及解决方案
- 用python进行wifi密码生成
- 坐标系旋转前后坐标的变化
- 【图像融合】基于matlab高斯金字塔+拉普拉斯金字塔彩色水下图像融合【含Matlab源码 1629期】
- 计算机wmi配置错误,系统没有WMI服务怎么办、WMI错误修复方法
- VirtualBox简单使用
- 再战双十一,阿里这回真的“上天”了!
- 重要知识:身份证复印件的正确使用方法
- Github上开源仿京东商城项目启动配置详解(进阶版)
- 《安富莱嵌入式周报》第245期:2021.12.20--2021.12.26
- Chrome侧边栏书签插件 Candy Bookmarks Sidebar
- echart图表环形图(饼图)
热门文章
- 教你如何在win11家庭版中添加【本地安全策略】
- Java实现emf转jpg png 图片转换
- 骚操作!用 Python 远程控制 Windows 服务器,太好用了!
- 如何使用CocoaPods?
- TPS5430设计24v转15v电源 | 附参考电路和各元器件的选型
- c 配置mysql字符串_mysql字符串属性实例学习
- (二十)unity shader之——————基于物理的渲染技术(PBS):下篇(PBS技术拓展:全局光照、伽马校正、HDR)
- 1.Paper小结——《Privacy-Preserving Federated Learning in Fog Computing》
- RDD编程初级实践-课程论文
- 超出ipc连接数范围_NVR添加不上IPC,咋整?---大华篇