我在Cocoa Framework中创建了一个我要导出的函数。这个函数是在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”行:
“预期标识符或(”
还有什么必要才能实现这一目标?
答案 0 :(得分:3)
您需要将extern "C"
添加到函数实现以及声明中。如果函数的实现在.mm
(Objective-C ++)文件中,它将被编译为Objective-C ++,名称为mangling。对于具有相同名称的函数,您碰巧有extern "C"
声明并不重要。他们仍被视为两件不同的事情。
所以将您的实现包装在extern "C"
中以删除函数实现的名称修改:
extern "C" void display(NSString *text) {
}
或者:
extern "C" {
void display(NSString *text) {
}
}
此外,如果您希望C代码可以使用您的标头,那么在编译为C ++时,您需要添加#ifdef
以仅使用extern
。 extern
不是C:
#ifdef __cplusplus
extern "C" {
#endif
void display(NSString *text);
#ifdef __cplusplus
}
#endif
有关详细信息,请参阅Combining C++ and C - how does #ifdef __cplusplus work?。