在 Objective-C++ 中包含与 Objective-C 宏冲突的C++头文件



在Xcode中,我创建了一个"Cocoa应用程序"项目。它的依赖项之一是包含C++代码的框架。我将 AppDelegate.m 重命名为 AppDelegate.mm 并包含框架。

项目编译失败。问题在于框架中的C++头文件使用了一些与Objective-C或Cocoa冲突的符号。

  • C++头文件定义了名为verify()check()的函数,它们与MacOSX10.8 SDK中的/usr/include/AssertMacros.h冲突。
  • C++头文件包含一个名为NO的变量,它与Objective-C宏NO冲突。

解决方法是修改框架中的C++代码以避免这些冲突。但由于这是一个由另一个组织维护的大型C++项目,这将需要时间,并且可能会在C++项目的未来更新中中断。

有没有办法告诉Clang/Xcode将这些C++头文件视为C++而不是Objective-C++?

读Mac OS 10.8附带的/usr/include/AssertMacros.h,看起来你可以做到:

#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0

在包含 AssertMacros.h 之前,这将阻止它定义称为 verify()check() 的宏。

关于NO:您可以使用预处理器为您重命名该变量。 例如:

#define NO NO_libraryname_renamed
#include <libraryname.hh>
#undef NO

根据库使用 NO 变量的方式,这可能会导致问题 — 如果标头将其声明为 extern ,那么您的 Cocoa 应用程序将以错误的名称引用它,并且您将收到一个未定义的符号错误。 但是,只要您不使用该变量,并且库不依赖于您的应用程序来定义该变量,那么您应该没问题。

(并向有问题的库提交错误报告,要求他们重命名变量。

混合几种语言需要悲伤。更重要的是将目标C++(本身是一种奇怪的混合体)与C++混合在一起。别这样。

最新更新