首页 > 解决方案 > 编译失败从 C++ 调用 Cocoa 函数

问题描述

全部,

我正在尝试编写以下函数(函数内联在某个标题中):

static bool CocoaFileNameGetSensitivity()
{
    NSNumber id;
    NSURL *url = [NSURL URLWithString:@"/"];
    [url getResourceValue: idforKey: NSURLVolumeSupportsCaseSensitiveNamesKey error: nil];
    return [id boolValue];
}

将该函数放在头文件中,并以这种方式从 C++(不是 Objective-C)调用该函数:

/* static */
bool MyClass::IsCaseSensitive()
{
    return CocoaFileNameGetSensitivity();
}

但我收到编译器错误:

错误:使用未声明的标识符“CocoaFileNameGetSensitivity”

我究竟做错了什么?

现在作为后续问题 - Objective-C/Cocoa 代码是否应该只在 .m/.mm 文件中?或者我可以在 .h 文件中编写它的代码?

标签: c++compilationobjective-c++

解决方案


这实际上是核心问题/见解:

Objective-C/Cocoa 代码应该只在 .m/.mm 文件中吗?或者我可以在 .h 文件中编写它的代码?

如果头文件是#include.c 或 .cpp 文件,那么不,您不能在其中使用 Objective-C 代码。避免这种情况可能会解决您的问题,尽管您发布的内容并不是 100% 清楚。

该错误error: use of undeclared identifier 'CocoaFileNameGetSensitivity'表明该定义可能位于#if未以纯 C++ 模式编译的块内。

在任何情况下,您都需要制作CocoaFileNameGetSensitivity()非静态并将其定义移动到 .m 或 .mm 文件中。然后声明可以保留在共享标头中,您唯一需要注意的是,您可能需要将其标记为extern "C"使用 C++ 编译器构建时,除非您专门在 Objective-C 和 C 中使用/定义该函数,或者目标 C++ 和 C++。如果混合使用 (Objective-)C 和 (Objective-)C++,则需要确保编译器同意 C 链接。


推荐阅读