编译无法从 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 链接。
全部,
我正在尝试编写以下函数(函数内联在某些 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 链接。