我在中创建了一个函数,我想导出它。这个函数是在ObjectiveC++中实现的,C++的名字使我抓狂。
我已经在一个外部"C“块中声明了该函数,但没有结果。
这是框架中的头文件:
#import <Cocoa/Cocoa.h>
extern "C"{
void display(NSString *text);
}
@interface Display : NSObject
@end
这是.mm文件:
#import "Display.h"
#include <string>
#include <iostream>
using namespace std;
void display(NSString *text){
cout << [text cStringUsingEncoding:NSUTF8StringEncoding] << endl;
}
@implementation Display
@end
它编译得很好,没有任何错误。
在客户端,我添加了框架,导入了公开的标头,并试图调用函数:
display(@"Hola");
这里我收到一个警告,抱怨“函数显示的隐式声明在C99中无效”。
为了使伤害雪上加霜,在公开的头文件中,我在extern "C“行中得到一个错误(框架项目中没有显示):
“预期标识符或("”)
还需要什么才能让这一切顺利进行呢?
发布于 2013-08-26 06:52:39
您需要将extern "C"
添加到函数实现和声明中。如果函数的实现在一个.mm
(Objective++)文件中,它将被编译为Objective++,并带有名称mangling。对于同名的函数,您有一个extern "C"
声明并不重要。他们仍然被看作是两件不同的事情。
因此,还可以在extern "C"
中包装您的实现,以删除函数实现的名称损坏:
extern "C" void display(NSString *text) {
}
或者:
extern "C" {
void display(NSString *text) {
}
}
此外,如果您希望您的头可以被C代码使用,那么您需要添加一个#ifdef
,以便在编译为C++时只使用extern
。在C中,extern
不是有效的关键字:
#ifdef __cplusplus
extern "C" {
#endif
void display(NSString *text);
#ifdef __cplusplus
}
#endif
有关详细信息,请参阅cplusplus work?。
https://stackoverflow.com/questions/18446218
复制相似问题