C++、Objective-c混編陷阱之–錯誤的標頭檔案引用
阿新 • • 發佈:2019-01-05
用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
|