首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何防止Cocoa框架中的C++名称损坏

如何防止Cocoa框架中的C++名称损坏
EN

Stack Overflow用户
提问于 2013-08-26 14:11:43
回答 1查看 1.4K关注 0票数 4

我在中创建了一个函数,我想导出它。这个函数是在ObjectiveC++中实现的,C++的名字使我抓狂。

我已经在一个外部"C“块中声明了该函数,但没有结果。

这是框架中的头文件:

代码语言:javascript
代码运行次数:0
运行
复制
#import <Cocoa/Cocoa.h>

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

@interface Display : NSObject

@end

这是.mm文件:

代码语言:javascript
代码运行次数:0
运行
复制
#import "Display.h"

#include <string>
#include <iostream>

using namespace std;

void display(NSString *text){
    cout << [text cStringUsingEncoding:NSUTF8StringEncoding] << endl;
}

@implementation Display


@end

它编译得很好,没有任何错误。

在客户端,我添加了框架,导入了公开的标头,并试图调用函数:

代码语言:javascript
代码运行次数:0
运行
复制
display(@"Hola");

这里我收到一个警告,抱怨“函数显示的隐式声明在C99中无效”

为了使伤害雪上加霜,在公开的头文件中,我在extern "C“行中得到一个错误(框架项目中没有显示):

“预期标识符或("”)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-26 14:52:39

您需要将extern "C"添加到函数实现和声明中。如果函数的实现在一个.mm (Objective++)文件中,它将被编译为Objective++,并带有名称mangling。对于同名的函数,您有一个extern "C"声明并不重要。他们仍然被看作是两件不同的事情。

因此,还可以在extern "C"中包装您的实现,以删除函数实现的名称损坏:

代码语言:javascript
代码运行次数:0
运行
复制
extern "C" void display(NSString *text) {

}

或者:

代码语言:javascript
代码运行次数:0
运行
复制
extern "C" {
    void display(NSString *text) {

    }
}

此外,如果您希望您的头可以被C代码使用,那么您需要添加一个#ifdef,以便在编译为C++时只使用extern。在C中,extern不是有效的关键字:

代码语言:javascript
代码运行次数:0
运行
复制
#ifdef __cplusplus
    extern "C" {
#endif
void display(NSString *text);
#ifdef __cplusplus
    }
#endif

有关详细信息,请参阅cplusplus work?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18446218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档