包含可可标头时出错

Errors when including Cocoa header

本文关键字:出错 可可 包含      更新时间:2023-10-16

我一直在创建一个在MacOS和Windows上使用的UI工具包,但我目前正在工作和测试MacOS方面的东西。最近,当我使用 CMake 编译我的代码时,我因包含 Cocoa 标头而出现不合理的错误。这是错误的幽灵箱。

我不确定这是否是你问题的完整答案,但希望它能给你一条前进的道路。感谢@uliwitness提到#if __OBJC__

所以 QT5 有一个用于 qmacextras 的 git 存储库,它结合了 c++ 和 objective-c,我正在做的事情以及我在导入<Foundation/Foundation.h><Cocoa/Cocoa.h>时如何看到一堆错误。查看他们的一些代码,我看到了这个:

// ### remove when merged to QtCore
/*!
* macro Q_FORWARD_DECLARE_OBJC_CLASS(classname)
*
* Forward-declares an Objective-C class name in a manner such that it can be
* compiled as either Objective-C or C++.
*
* This is primarily intended for use in header files that may be included by
* both Objective-C and C++ source files.
*/
#ifdef __OBJC__
#define Q_FORWARD_DECLARE_OBJC_CLASS(classname) @class classname
#else
#define Q_FORWARD_DECLARE_OBJC_CLASS(classname) typedef struct objc_object classname
#endif

// Put in your header file
Q_FORWARD_DECLARE_OBJC_CLASS(NSData);
Q_FORWARD_DECLARE_OBJC_CLASS(NSImage);
// etc

https://code.qt.io/cgit/qt/qtmacextras.git/tree/examples/macextras/macfunctions?h=5.14

使用此方法可能会消除这些错误。

你真的不是在问一个问题...但是从您提供的少量信息中随意一瞥,看起来有 ObjC 代码正在通过非 ObjC 编译器运行。

当有人包含来自 C 或C++源文件的 ObjC 标头时,通常会发生这种情况。导致这种情况的一种非常常见的方法是向包含 Cocoa/Cocoa.h 的项目添加一个预编译标头。预编译标头用于您编译的所有C 后代语言,因此也用于 C 或 C++ 文件。

若要避免特定于 ObjC的代码包含在非 ObjC 文件中,请将其包装在#if __OBJC__预处理器宏中。(这也适用于预编译标头中的C++代码,您需要将其包装在#if __cplusplus中(