如何防止Cocoa框架中的C ++名称变形

时间:2013-08-26 14:11:44

标签: c++ objective-c cocoa objective-c++ name-mangling

我在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”行:

“预期标识符或(”

还有什么必要才能实现这一目标?

1 个答案:

答案 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以仅使用externextern不是C:

中的有效关键字
#ifdef __cplusplus
    extern "C" {
#endif
void display(NSString *text);
#ifdef __cplusplus
    }
#endif

有关详细信息,请参阅Combining C++ and C - how does #ifdef __cplusplus work?