OC里面的有三大類文件.m/.h(OC),.c/.h (C),.cpp/.hpp(C++)。
一、在OC中調用C或者C++
如果是.m文件,可以用OC和C的代碼;
如果是.mm文件,可以用OC和C和C++的代碼;
.m 和.mm 的區別是告訴編譯器在編譯時要加的一些參數。.mm也可以命名成.m,手動加編譯參數。
二、在C++中調用OC
PIMPL (Private Implementation, 私有實現)
不要在C++中依賴ARC,最好自己手動管理。
遇到的問題:
1,嘗試在同一個文件中調用oc、c、c++,ld: symbol(s) not found for architecture x86_64。
問題出現的原因和OC無關,在c++中引用c的頭文件,需要用extern "C"{}把代碼包括起來。詳細原因見下:
http://stackoverflow.com/questions/9334650/linker-error-calling-c-function-from-objective-c
2,在c++中調用OC時遇到了問題,在.cpp文件中調用OC的類,在Foundation處報錯。
問題出現在.cpp文件用的是純粹的c++編譯。
解決方案:把實現放在.mm。
learnCplus(1, 2); //在OC中使用c learnCplusplus(1, 2); //在OC中用C++編譯的C //在OC中使用C++的類 object = new cppObject(); NSString* str = @"GAO高級\n"; std::string cpp_str([str UTF8String], [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); object->exampleMethod(cpp_str); delete object; object = NULL; //記得刪除 //在OC使用的C++類中 使用OC LY::OCinCPP* cpp = new LY::OCinCPP(); cpp->lyRun();
實現的代碼放在了 GIT https://github.com/loyinglin/LearnCandC-InObjective-C.git
參考
