编译无法从 C++ 调用 Cocoa 函数

Compilation fails calling Cocoa function from C++

全部,

我正在尝试编写以下函数(函数内联在某些 header 中):

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

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

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

但我遇到编译器错误:

错误:使用了未声明的标识符 'CocoaFileNameGetSensitivity'

我做错了什么?

现在作为一个 follow-up 问题 - Objective-C/Cocoa 代码是否应该只存在于 .m/.mm 文件中?或者我可以把它的代码写在.h文件里?

这才是核心question/insight:

does Objective-C/Cocoa code should be only in .m/.mm files? Or I can write its code in the .h file?

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

错误 error: use of undeclared identifier 'CocoaFileNameGetSensitivity' 表明定义可能位于 #if 块中,该块不是在纯 C++ 模式下编译的。

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