有时候,出于性能或可移植性的考虑,需要在iOS项目中使用到C++。
假设我们用C++写了下面的People类:
// // People.h // MixedWithCppDemo // // Created by Jason Lee on 12-8-18. // Copyright (c) 2012年 Jason Lee. All rights reserved. // #ifndef __MixedWithCppDemo__People__ #define __MixedWithCppDemo__People__ #include <iostream> class People { public: void say(const char *words); }; #endif /* defined(__MixedWithCppDemo__People__) */
// // People.cpp // MixedWithCppDemo // // Created by Jason Lee on 12-8-18. // Copyright (c) 2012年 Jason Lee. All rights reserved. // #include "People.h" void People::say(const char *words) { std::cout << words << std::endl; }
然后,我们用Objective-C封装一下,这时候文件后缀需要为.mm,以告诉编译器这是和C++混编的代码:
// // PeopleWrapper.h // MixedWithCppDemo // // Created by Jason Lee on 12-8-18. // Copyright (c) 2012年 Jason Lee. All rights reserved. // #import <Foundation/Foundation.h> #include "People.h" @interface PeopleWrapper : NSObject { People *people; } - (void)say:(NSString *)words; @end
// // PeopleWrapper.mm // MixedWithCppDemo // // Created by Jason Lee on 12-8-18. // Copyright (c) 2012年 Jason Lee. All rights reserved. // #import "PeopleWrapper.h" @implementation PeopleWrapper - (void)say:(NSString *)words { people->say([words UTF8String]); } @end
最后,我们需要在ViewController.m文件中使用PeopleWrapper:
PeopleWrapper *people = [[PeopleWrapper alloc] init]; [people say:@"Hello, Cpp.\n"]; [people release], people = nil;
结果发现编译通不过,提示“iostream file not found”之类的错误。
这是由于ViewController.m实际上也用到了C++代码,同样需要改后缀名为.mm。
修改后缀名后编译通过,可以看到输出“
Hello, Cpp.
”。