`
ocen713
  • 浏览: 36874 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++和Objective-C混编

阅读更多
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代码捕获。


原文网址:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html
分享到:
评论

相关推荐

    C++和Objective-C混编 如何在xcode中用C++的STL

    本篇文章将详细介绍如何在Xcode中进行C++和Objective-C的混编,以便在Objective-C项目中使用C++的STL。 首先,我们需要理解C++和Objective-C之间的主要差异。Objective-C是C的超集,增加了面向对象特性,如类别...

    在Objective-C中使用C++

    在Objective-C中使用C++是iOS和Mac开发中常见的技术结合,因为Objective-C是Apple的主推编程语言,而C++则是一种强大的、通用的面向对象的语言,尤其适合处理底层计算和高性能的需求。这篇博客(&lt;https://eric-gao....

    Objective-C和C++混编的要点

     苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你可以在Objective-C应用程序中使用已有的C++类库。  Objective-C和C++混编的要点 ...

    OC与c++混编文件

    3. **Objective-C++ Classes混编:** 直接在Objective-C++(`.mm`)文件中定义类,可以无缝集成OC和C++代码。在这种情况下,类既可以继承自Objective-C的`NSObject`,也可以包含C++的成员变量和方法。例如: ```cpp...

    从C&amp;C++过渡到Objective-C

    Objective-C和Swift可以混编,使得现有项目能逐步迁移到Swift。 学习Objective-C不仅意味着掌握一种新的编程语言,更意味着进入一个充满机遇的开发领域。理解并熟练运用这些知识点,你将能够构建出功能丰富的iOS和...

    Objective-C +程序语言介绍+程序语言本身以及它的运行环境+应用开发框架 库(Cocoa)

    这意味着Objective-C程序员能够充分利用C++强大的功能和成熟的库,尽管在两种语言之间进行混编时需要一些特殊的注意。 在运行时系统方面,Objective-C主要关注类NSObject,它是最基本的类,几乎所有的对象都是它的...

    objective-c 基础教程

    Swift与Objective-C可以混编,方便迁移旧项目。 六、Xcode的使用 Xcode是苹果官方的开发工具,支持Objective-C和Swift编程。Xcode4.2+版本已经很成熟,包含了编写、调试、测试和打包应用所需的所有功能。使用...

    learn objective-c for java developers

    10. **Objective-C++**:Objective-C与C++可以混编,这使得引入C++库或利用C++的强大功能成为可能,但需要注意两者的兼容性问题。 总的来说,从Java到Objective-C的迁移需要对这两种语言的异同有深入理解,特别是...

    Objective-C

    Objective-C是一种面向对象...Swift与Objective-C可以混编,使得Objective-C的现有代码库仍能发挥作用。此外,Objective-C的动态特性和强大的Cocoa框架使其在特定场景下仍具有优势,特别是在维护旧项目或利用现有库时。

    swift oc c++混编framework demo

    在iOS和macOS开发中,有时我们需要利用Swift、Objective-C(OC)和C++三种语言的优势,以构建高效且跨平台的代码库。在这种情况下,创建一个混合编译的Framework可以是一个理想的选择。"swift oc c++混编framework ...

    ios 调用c++代码

    下面将详细介绍如何在Xcode中进行C++和Objective-C的混编,以及如何调用C++的STL。 首先,让我们了解一些基础知识。Objective-C是C的超集,它扩展了C语言,添加了面向对象的特性,如消息传递和类别。C++则是在C的...

    ios demo,object-c调用函数和c++函数

    3. **混编Objective-C和C++**:在同一个.m文件中,你也可以使用`#ifdef __cplusplus`来在Objective-C和C++代码之间切换。这种方式通常用于在已有的Objective-C类中添加C++功能,但不推荐在大型项目中使用,因为它...

    Swift与OC,C++混合编程

    在Xcode中,配置好桥接头文件后,Swift代码就可以直接调用Objective-C类和方法,或者通过C语言的extern关键字调用C++函数。 Swift与OC混合编程的主要步骤包括: 1. 创建桥接头文件:在Xcode项目中,选择`File &gt; New...

    从C++到Objective C的学习之路

    8. **Objective C++**:Objective C和C++可以混编,Objective C++是它们的结合体,允许在同一个项目中使用Objective C的特性以及C++的模板和STL。 9. **异常处理**:C++支持异常处理,通过try、catch、throw语句来...

    Cocos2d-x与Android交互(c++与java互调),与IOS交互(c++与objective c混编)

    Cocos2d-x与Android交互(c++与java互调),与IOS交互(c++与objective c混编) 具体的代码请下载这个文件,里面有更详细的jni使用方法,包括传递基本数据类型,返回基本数据类型的值,及类型的转换。

    xcode下使用curl下载图片并保存

    1. **Xcode与C++/Objective-C混编**: Xcode作为Apple的官方开发工具,支持多种编程语言,包括C++和Objective-C。混编这两种语言可以在面向对象的Objective-C基础上利用C++的性能优势。通过`#import`或`#include`...

    Objective C基础课程

    15. **Using C++ With Objective-C** - Objective-C和C++可以混编,允许你利用C++的模板和面向对象特性,同时保持Objective-C的消息传递。 学习Objective-C还需要了解开发工具Xcode和Interface Builder,以及...

    Cocos2d-x + Lua接入iOS原生SDK的实现方案 - Cocos2d-x 开发笔记 - Cocos2d-x系列教程

    2. 在Xcode中,使用.mm文件进行混编,同时引入Objective-C和C++代码。注意头文件的包含规则,Objective-C使用#import,C/C++使用#include。 3. Block是Objective-C的特性,允许在其中直接编写C++代码,方便回调。...

    json_c.zip

    混编C++代码和Objective-C/Swift代码在iOS开发中并不常见,但在特定情况下是必要的,比如利用已有的C++库或者需要C++的高性能计算。Xcode提供了Clang的桥接技术来支持这种混编,通过创建一个Objective-C++或Swift的...

    Cocos2d-x Recorder

    总结,Cocos2d-x Recorder的实现涉及Cocos2d-x的音频引擎、Objective-C与C++的混编技术,以及CocosBuilder的界面设计和控制。掌握这些知识点,开发者可以构建出具有高质量录音功能和精美界面的游戏应用。在实践中,...

Global site tag (gtag.js) - Google Analytics