iphone开发之C++和Objective-C混编

Objecive-C语法与iPhone开发入门 资源中有两本电子书,一个是介绍Objecive-C语法的,另一个是iPhone开发的入门书籍,可以让手机开发的程序员在很短的时间内上手 立即下载

 C++和Objective-C混编(官方文档翻译)

原文网址:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html

 

Using C++ With Objective-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++扩展。

/* Hello.mm

   * Compile with: g++ -x objective-c++ -framework Foundation Hello.mm  -o hello

   */

 

  #import <Foundation/Foundation.h>

  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]);

      }

  };

 

  @interface Greeting : NSObject {

  @private

    Hello *hello;

}

- (id)init;

- (void)dealloc;

  - (void)sayGreeting;

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

@end

@implementation Greeting

- (id)init {

if (self = [super init]) {

   hello = new Hello();

}

return self;

}

- (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("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 { /* ... */ };

@interface ObjCClass: Base ... @end // ERROR!

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

 

   与 OC不同的是,C++对象是静态类型的,有运行时多态是特殊情况。两种语言的对象模型因此不能直接兼容。更根本的,OC和C++对象在内存中的布局是互不 相容的,也就是说,一般不可能创建一个对象实例从两种语言的角度来看都是有效的。因此,两种类型层次结构不能被混合。

    你可以在OC类内部声明C++类,编译器把这些类当作已声明在全局名称空间来对待。就像下面: 

 

@interface Foo {

class Bar { ... } // OK

}

@end

Bar *barPtr; // OK

 

    OC允许C结构作为实例变量,不管它是否声明在OC声明内部。

 

@interface 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方法内,编译器预声明了标识符self和super,就想C++中的关键字this。跟C++的this不同的是,self和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里类名和分类名有单独的命名空间。@interface foo和@interface(foo)能够同时存在在一个源代码中。OC++里,你也能用C++中的类名或结构名来命名你的分类。

协议和template标识符使用语法相同但目的不同:

id<someProtocolName> foo;TemplateType<SomeTypeName> bar;

为了避免这种含糊之处,编译器不允许把id做template名称。    最后,C++有一个语法歧义,当一个label后面跟了一个表达式表示一个全局名称时,就像下面:

label: ::global_name = 3;

第一个冒号后面需要空格。OC++有类似情况,也需要一个空格:

receiver selector: ::global_c++_name;

 

 

限制

   OC++ 没有为OC类增加C++的功能,也没有为C++类增加OC的功能。例如,你不能用OC语法调用C++对象,也不能为OC对象增加构造函数和析构函数,也不 能将this和self互相替换使用。类的体系结构是独立的。C++类不能继承OC类,OC类也不能继承C++类。另外,多语言异常处理是不支持的。也就 是说,一个OC抛出的异常不能被C++代码捕获,反过来C++代码抛出的异常不能被OC代码捕获。

ROS专栏—基于STM32F103的INA219电源数据采集 文章主要记录了stm32f103对ina219的数据采集 阅读详情

相关推荐

群晖Lucky套件高级玩法-——更新证书同步更新群晖自带证书

群晖Lucky套件高级玩法-——更新证书同步更新群晖自带证书

wojuzi的博客 2455

iOS开发-OC、Swift、C、C++ 混合编程

OC、Swift、C、C++可以互相调用,也可以混合编程,只需要注意一些规则和配置即可。 mm文件中的C++,其实是objective c++,并不算严格意义上的C++ cpp文件可以在xcode中直接编译 swift不支持C++混编,也不能调用C++的类或者函数,得用OC包一层。倒是可以调用C的函数,可能是C++的语法太复杂了。 如果是.m文件,可以用OC和C的代码; 如果是.mm文件,可以用OC和C和C++的代码;.m 和.mm 的区别是告诉编译器在编译时要加的一些参数。 PIMPL ...

程序猿老樊的博客 1950

OCV/AOCV/SOCV的介绍和应用

library中的cell delay是在某个固定的PVT(operating condition)下仿真得出的。,cell的delay并不是一个固定值,而是一个随机值,遵循高斯分布或门特卡洛分布,在STA中用OCV来模拟这一『特征』。OCV全称on chip variation,用于描述不同管子间由于工艺偏差、电压降、温度变化引起的delay变化。,也用于描述工艺偏差引起的net厚度宽度的变化从而导致net的电容电阻变化。优点:设置起来比较简单粗暴,对于不那么先进的工艺可行!的影响,更贴合实际。

m0_61003348的博客 8980

iOS Objective-C和C、C++混编

iOS Objective-C和C、C++混编,最简单的办法是直接将要调用C、C++代码的.m文件改成.mm文件。 1、Objective-C和C混编,如果C方法写在.m文件内部,我们直接调用即可。 #import "ViewController.h" @interface ViewController () @end @implementation ViewController // ...

programmer589的博客 1000

cellranger安装以及使用

接受cellranger count的输出数据,将同一组的不同测序样本的表达矩阵整合在一起,比如tumor组原来有4个样本,PBMC组有两个样本,现在可以使用aggr生成最后的tumor和PBMC两个矩阵,并且进行标准化去掉测序深度的影响。但是由于病毒基因组太小了,且注释结果只有CDS没有exon,所以曲线救国,将CDS整体替换为exon,也不进行过滤了,直接下一步。虽然安装完毕,但是现在要运行cellranger的话需要在终端输入cellranger的整个路径。自动执行这个命令,需要将“

m0_59974475的博客 9393

Matlab安装硬件支持包、simulink离线安装硬件支持包安装,离线安装ESP32、stm32等安装包,Are you up-to-date on SoftWare Maintenance?

注意:如果提示出现“没有可从此位置安装的兼容支持包后,这个问题,请查看步骤5,是不是没有按照步骤5进行操作.一般情况下出现“没有可从此位置安装的兼容支持包”后,重新安装选择了默认路径就可以成功。如果不是很清楚,直接安装在默认的文件夹下面,即使这个文件夹下没有matlab相关的文件夹,也要这么下载,没有为什么,切记尽量按默认路径安装,更改下载的路径不成功,别怪我没提醒。:下载到哪里非常重要,如果下载的不是默认的路径下,就需要将其中这个的是这个archives文件夹,连同其他文件一并要复制出来,拷贝到。

pvmsmfchcs的博客 1746

objective-c与c的混编之道

ocbjective-c,大家简称oc,oc一般来说不需要和底层的c\c++混编,一是oc效率已经很快,二是二者混编对于一般开发者来说难度太大,坑太多,但有时候,有的框架、算法等已经用c/c++写好了,用oc重写太费劲,那么不如直接拿过来用,但偶尔c/c++中涉及到需要和被调用模块交互的地方,这个时候,就需要用底层调上层。 oc可以兼容c,但是c不能兼容oc,这就尴尬了。这篇博客的代码样例没有什...

NiZhuanXingHeIT的博客 3525

uniApp微信小程序:error: 60001 request:fail errcode:-101 cronet error code:-101error_msg:net::ERR CONNECTI

uni-app微信小程序域名访问报error 60001 request:fail errcode:-101,解决Uniapp微信小程序报600001错误,uni.request()接口请求报错,服务器更换SSL证书后,uniapp微信小程序出现`request:fail errcode:-101`问题分析与解决,服务器更换ssl证书后,手机访问微信小程序异常,微信小程序更换SSL证书后出现请求报错,服务器更换SSL证书,微信小程序报600001,小程序反应偶尔出现request:fail errcode:

✅ 精选推荐文章 4583

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

苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就能够在Objective-C利用过程中利用已有的C++类库。Objective-C和C++混编的关键在 Objective-C++中,能够用C++代码调用措施也能够从Objective-C调用措施。在这两种语言里对象都是指针,能够在任何地方利...

weixin_30038009的博客 628

在 SAP GUI 里开发与调用 Adobe PDF 表单:SFP 建模 + Driver Program 调用的全流程实战

本文介绍了在SAP系统中使用Adobe PDF表单的完整流程。重点阐述了SAP Interactive Forms相比传统表单工具的优势,特别是在处理复杂排版、条码和交互式字段时的适用性。文章详细说明了开发流程:从安装设计工具Adobe LiveCycle Designer开始,到在SFP事务码中创建Interface和Form的数据模型,再到编写驱动程序的ABAP代码实现PDF输出。特别强调了Interface作为数据契约的重要性,以及如何通过分层设计实现前后端分离开发。最后提供了标准调用链的示例代码,展

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 275

最大面积验证码通用解法

最大面积验证码、面积验证通用解法

九月镇灵将的博客 1043

iOS开发时OC与C的混编中,strcpy导致的内存溢出、野指针

在最近的项目开发中,由于需要使用C语言的算法供给OC项目调用,所以研究了一下OC与C的混编及.a库的相关生成。而在混编的过程中,C语言的算法都能正常调用了,但是被一个问题困扰了很长一段时间,就是在连续调用的过程中,很容易抛出野指针而导致程序崩溃,且Xcode无法捕捉相应的异常。下面是我的部分OC与C的混编代码: NSString *strMsg = [[NSString alloc]i

Small_Tgs的专栏 3559

17.6 LangSmith 私有化部署实战指南:企业级AI应用的安全基石

LangSmith 私有化部署, 企业级AI开发平台, 数据隐私合规, 混合云架构, 模型监控与审计。

yonggeit的博客 3777

iphone开发之C++和Objective-C混编 如何在xcode中用C++的STL

没什么好说的,你只要看了cocoachina里的那篇翻译的官方文档,跑一下我 给的例子,混编应该没什么大碍了吧,自吹一下,哈哈哈。iphone开发里面xcode使用stl其实也不是有那么困难的,我例子只是基本的使用方式说明,高级的还要自己努力。废话不多,代码放出。

随记 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

详解iPhone开发之Objective-C和 C 混编

详解iPhone开发之Objective-C和 C 混编 2011-07-29 15:47 佚名 互联网 字号:T | T 本文介绍的是详解iPhone开发之Objective-C和C混编,介绍了iphone开发中的Objective-C的内容,先来看内容。 AD: 详解iPhone开发之Objective-C和C混编是本文要介绍的内

痞子龙3D编程 1129

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

c++判断iphone网络状况

c++判断iphone网络状况 最近在用cocos2dx做一个ipad网游,需要对网络类型进行判断。其实iphone的网络判断代码随便google就能找到。这里最大的问题也就是oc和c++的混编问题。话不多说,搞起。 一开始是和使用oc做网络判断的步骤一样的。 首先添加framework, 将SystemConfiguration.framework 添加进工程中来。 然后

luxiaoyu_sdc的专栏 1790

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

iOS C++/OC 混编

iOS C++/OC 混编

qq_43667155的博客 259
上一篇: iphone开发之获取是否飞行模式和设备IMEI
下一篇: iphone开发之获取系统字体
ArthurChen
博客等级 码龄17年 298粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值