c++ - 编译失败从 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 文件中编写它的代码?
解决方案
这实际上是核心问题/见解:
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 链接。
推荐阅读
- jupyter-notebook - 将行复制到 Jupiter notebook 时如何避免出现不好的缩进?
- javascript - new Function() 返回最后一个值?
- arrays - (Golang)将数组中的所有行插入到表中
- grafana - Grafana _field 显示名称模式 - 范围或正则表达式
- linux - 鳄梨酱连接和“@”
- database - 更新 SQLite 中的大 blob
- laravel - 在 Laravel 中推送数据而不是更新 json 列
- php - 在商店和存档页面中选择变量时如何更改产品图片?
- visual-studio-code - VSCode 在所选内容或单个 Word 周围插入双圆括号
- migration - 将消费逻辑应用迁移到标准