1. 程式人生 > >C++、Objective-c混編陷阱之–錯誤的標頭檔案引用

C++、Objective-c混編陷阱之–錯誤的標頭檔案引用

用C++/OC混編的時候,如果不是很熟練,經常會碰到類似如下的錯誤:

  • Parse Issue Expected unqualified-id
  • Semantic Issue Unknown type name ‘NSString’; did you mean ‘CCString’?

而且這些錯誤通常是來自OC提供的庫檔案,比如說NSObjcRuntime.h,這就讓人很頭大,尤其是像我這樣剛學OC的人。

問題解決起來很簡單,首先檢查xcode設定,把編譯器的Compile Sources As選項改為Objective C++;其次仔細檢查.cpp檔案,看有沒有include的標頭檔案中包含了”#import xxxxx”這樣的程式碼。如果有的話,則存在C++/OC的混編,需要將.cpp字尾修改為.mm字尾,這是因為Xcode需要原始檔以”.mm”為副檔名,這樣才能啟動編譯器的Objective-C++擴充套件,否則會把.cpp檔案直接按c style來編譯,遇到OC的東西,自然就無法解析了。

這裡貼一個典型的例子,有下面兩個類A、B(類的功能可能有些牽強,但是不影響理解),一個是C++ style,一個是OC style。這種情況下,編譯器就會報類似如上的錯誤

幫助
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // A.h #include <iostream> using namespace std; class A { public: void printB(); }; // A.cpp #include "A.h" #include "B.h" void A::printB { B* b = [[B alloc] init];
[b display]; }
幫助
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //  B.h #import <Foundation/Foundation.h> @interface B : NSObject { float _b; } - (void) display; @end // B.m #import "B.h" @implementation B - (void) display { NSLog(@"_b = %f", _b); } @end