用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
|