包含Cocoa标头时出错

时间:2018-06-15 02:42:10

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

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

2 个答案:

答案 0 :(得分:1)

您并不是真正要问的问题...但是,随便看一下您所提供的信息很少,看起来好像是通过非ObjC编译器运行的ObjC代码。

这通常在有人从C或C ++源文件包含ObjC标头时发生。导致这种情况的一种非常常见的方法是向您的项目中添加一个包含Cocoa / Cocoa.h的预编译头。预编译的标头用于您编译的 all C语言降序语言,也用于C或C ++文件。

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

答案 1 :(得分: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

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