【问题标题】:Errors when including Cocoa header包含 Cocoa 标头时的错误
【发布时间】:2018-11-24 21:04:48
【问题描述】:

我一直在创建一个在 MacOS 和 Windows 上使用的 UI 工具包,但我目前正在工作和测试 MacOS 方面的东西。最近,当我使用 CMake 编译我的代码时,我从包含 Cocoa 标头中得到了不合理的错误数量。 Here 是错误的幽灵。

【问题讨论】:

  • 您的 ghostbin 链接似乎已失效。我也遇到了很多错误,unqualified-idunknown type name 等,我认为这是因为我有两个库在同一个项目中导入 Cocoa/Foundation 标头。可能是。很难说,因为关于这个主题的帖子不多。

标签: c++ macos cocoa objective-c++ foundation


【解决方案1】:

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

所以 QT5 有一个用于 qmacextras 的 git repo,它结合了 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

使用它可能会消除这些错误。

【讨论】:

    【解决方案2】:

    您并不是真的在问问题……但随便看看您提供的少量信息,似乎有 ObjC 代码正在通过非 ObjC 编译器运行。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      相关资源
      最近更新 更多