[ios]你是如何从 iPhone 中的 c + + 代码调用 C 函数的?

标签: Xcode iphone C++ ios C
发布时间: 2017/3/28 23:29:24
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我已将该行添加 extern "C" void perlinTest(void); 到一起的 c 头文件希望包括所有我需要但编译器的 c + + 头抱怨︰

Undefined symbols for architecture i386:
  "perlinTest()", referenced from:
      CreateRenderer3(IResourceManager*) in Renderer.o

解决方法 1:

C + + 代码需要被意识到的函数是一个 C 函数。要这样做,您需要将其声明这种方式︰

extern "C" [prototype];

一个现实的例子,您的情况将是︰

extern "C" void perlinTest();

原因是, c + + 函数名的错位的东西可以告诉关于参数的类型。在最低的一级,这是什么允许重载︰ 从来没有真正是合法的有两个共享相同的名称,所以 c + + 允许他们通过嵌入标记指示中的函数名称的参数的类型的可见符号。例如, void perlinTest() 作为获取出错 _Z10perlinTestv 对我的狮子箱子 g++ (和可能 clang++ ),尽管这是特定于 ABI 的并不一定会在其他平台上一样。

然而,C 不支持重载,和功能不受名称重整,因此,当您的 c + + 代码试图调用一个,它需要知道它必须使用一个 mangled 的名称。这是什么 extern "C" 告诉编译器。

如果需要可读从 C 和 c + + 头文件,通常的做法是裹在 extern "C" 块 ( extern "C" { /* declarations */ } ) 被包裹在 #ifdef __cplusplus 预处理器指令 (所以不会看到 C 代码 extern "C" 代码)。

#ifdef __cplusplus
extern "C" {
#endif

/* header body */

#ifdef __cplusplus
}
#endif
赞助商