iOS開發-OC、C、C++ 混編


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 

參考

http://blog.csdn.net/horkychen/article/details/7935910

http://www.mamicode.com/info-detail-416411.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM