4

我在要导出的 Cocoa 框架中创建了一个函数。这个函数是在 ObjectiveC++ 中实现的,C++ 的名字修饰让我发疯。

我已经在 extern "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" 行中收到一个错误(未出现在框架项目中):

"预期标识符或 ("

要让这一切顺利进行还需要什么?

4

1 回答 1

4

您需要添加extern "C"到函数实现以及声明中。如果函数的实现在.mm(Objective-C++) 文件中,它将被编译为 Objective-C++,并带有名称修饰。extern "C"碰巧有一个同名函数的声明并不重要。它们仍然被视为两种不同的事物。

因此extern "C",也将您的实现包装起来,以删除函数实现的名称修饰:

extern "C" void display(NSString *text) {

}

或者:

extern "C" {
    void display(NSString *text) {

    }
}

此外,如果您希望您的标头可供 C 代码使用,则需要添加一个#ifdefextern在编译为 C++ 时使用。extern不是 C 中的有效关键字:

#ifdef __cplusplus
    extern "C" {
#endif
void display(NSString *text);
#ifdef __cplusplus
    }
#endif

请参阅结合 C++ 和 C - #ifdef __cplusplus 如何工作?了解更多信息。

于 2013-08-26T14:52:39.073 回答