我一直在创建一个在MacOS和Windows上使用的UI工具包,但我目前正在使用和测试MacOS方面的东西。最近,当我使用CMake编译我的代码时,我从包含Cocoa标题中得到了不合理的错误。 Here是错误的幽灵。
答案 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
使用此方法可以消除这些错误。