c++ - 如何防止 Cocoa 框架中的 C++ 名称重整

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

我在要导出的 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++ 时仅使用 externextern 不是 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/

相关文章:

ios - NSOperationQueue 和传递数据

C++ vector : Function not viable + No matching function

C++ OpenGL fstream 问题

objective-c - Xcode调试问题

iphone - 我可以使用类别来添加类方法吗?

iphone - 需要有关 iPhone 上的动画的帮助

c++ - 有没有办法检查模板是什么数据类型?

c++ - 共享指针和具有自定义删除器的唯一指针之间的语法差异背后的任何原因

objective-c - 订阅 NSNotifications 时如何使用 Objective C 选择器作为参数?

objective-c - Objective-C 中的鼠标按下事件