我在要导出的 Cocoa 框架中创建了一个函数。这个函数是在 ObjectiveC++ 中实现的,C++ 的名称重整让我抓狂。
我已经在 extern "C" block 中声明了该函数,但没有用。
这是我在框架中的头文件:
#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
它编译正常,没有任何错误。
在客户端,我添加了框架,导入了公开的 header 并尝试调用函数:
display(@"Hola");
在这里,我收到一条警告,提示 “函数显示的隐式声明在 C99 中无效”。
雪上加霜的是,在暴露的头文件中,我在 extern "C"行中收到一个错误(在框架项目中没有显示):
“预期标识符或(”
要实现这一点还需要什么?
最佳答案
您需要在函数实现和声明中添加extern "C"
。如果函数的实现在 .mm
(Objective-C++) 文件中,它将被编译为 Objective-C++,并进行名称重整。碰巧有一个同名函数的 extern "C"
声明并不重要。它们仍然被视为两种不同的东西。
因此,将您的实现也包装在 extern "C"
中,以删除函数实现的名称重整:
extern "C" void display(NSString *text) {
}
或者:
extern "C" {
void display(NSString *text) {
}
}
此外,如果您希望 C 代码可以使用您的 header ,则需要添加 #ifdef
以便在编译为 C++ 时仅使用 extern
。 extern
不是 C 中的有效关键字:
#ifdef __cplusplus
extern "C" {
#endif
void display(NSString *text);
#ifdef __cplusplus
}
#endif
参见 Combining C++ and C - how does #ifdef __cplusplus work?获取更多信息。
关于c++ - 如何防止 Cocoa 框架中的 C++ 名称重整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446218/