gpt4 book ai didi

iphone - 如何从 iPhone 中的 C++ 代码调用 C 函数?

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:50 27 4
gpt4 key购买 nike

我将 extern "C"void perlinTest(void); 行添加到 C++ 头文件以及包含的 c 头文件中,希望这就是我所需要的,但编译器提示:

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

最佳答案

您的 C++ 代码需要知道该函数是 C 函数。为此,您需要这样声明:

extern "C" [prototype];

您的情况的一个现实示例是:

extern "C" void perlinTest();

原因是C++ function names are mangled告诉一些关于参数类型的东西。在最低级别,这就是允许重载的原因:拥有两个共享相同名称的可见符号从来都不是真正合法的,因此 C++ 通过在函数名称中嵌入指示参数类型的标记来允许它们。例如,void perlinTest() 在我的带有 g++(可能还有 clang++)的 Lion 盒子上被损坏为 _Z10perlinTestv ,尽管这是特定于 ABI 的,在其他平台上不一定相同。

但是,C 不支持重载,并且函数不受名称修饰的影响,因此当您的 C++ 代码尝试调用一个函数时,它需要知道它不得使用经过修饰的名称。这就是 extern "C" 告诉编译器的内容。

如果您的头文件需要在 C 和 C++ 中都可读,通常的做法是将它们包装在 extern "C" block 中(extern "C"{/* declarations */) 本身包含在 #ifdef __cplusplus 预处理器指令中(因此 C 代码看不到 extern "C" 代码)。

#ifdef __cplusplus
extern "C" {
#endif

/* header body */

#ifdef __cplusplus
}
#endif

关于iphone - 如何从 iPhone 中的 C++ 代码调用 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com