Xcode 包括C++;Objective-C+中的头文件+;当它们与Objective-C宏冲突时

Xcode 包括C++;Objective-C+中的头文件+;当它们与Objective-C宏冲突时,xcode,clang,objective-c++,Xcode,Clang,Objective C++,在Xcode中,我创建了一个“Cocoa应用程序”项目。它的一个依赖项是一个包含C++代码的框架。我将AppDelegate.m重命名为AppDelegate.mm并包含了框架 该项目未能编译。问题是框架中的C++头文件使用的是与Objto-C或COCOA冲突的一些符号。p> LI> C++头文件定义了名为 ValIFyE()/和检查()>代码>,与MaCOSX108SDK. C++头文件包含一个名为 NO> 的变量,与Objy-C宏代码> > < < /代码>冲突。 一个解决办法是修改

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

该项目未能编译。问题是框架中的C++头文件使用的是与Objto-C或COCOA冲突的一些符号。p>
    <> LI> C++头文件定义了名为<代码> ValIFyE()/<代码>和<代码>检查()>代码>,与MaCOSX108SDK.<李>
  • C++头文件包含一个名为<代码> NO> <代码>的变量,与Objy-C宏代码> > < < /代码>冲突。<李>

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


有没有办法告诉CLAN/XCODE把C++头文件作为C++来处理,而不是Objy-C++?p> 多种语言的混合会带来悲伤。更进一步,将目标C++(本身为一个奇怪的混合)与C++混合。不要这样做。

多种语言的混合会带来悲伤。更进一步,将目标C++(本身为一个奇怪的混合)与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应用程序将以错误的名称引用它,并且您将收到未定义的符号错误。但是,只要您不使用该变量,并且库不依赖于您的应用程序来定义该变量,那么您就可以了


(请向有问题的库提交错误报告,要求它们重命名其变量。)

阅读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应用程序将以错误的名称引用它,并且您将收到未定义的符号错误。但是,只要您不使用该变量,并且库不依赖于您的应用程序来定义该变量,那么您就可以了


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

不可选择。应用程序需要是Cocoa。C++代码太大,无法重写。应用程序需要是Cocoa。C++代码太大,无法重写。也许编译时,沿用代码> > g++-dSuff= vrFy-dCuff= CHK…<代码>,以便全局重新定义这些宏?(只是用<代码> G++< /COD>检查,这里只对重新定义进行抱怨。记住C++和目标C都是C的超集。你正在获得的符号是C函数或宏,而不是C函数或C++函数。我的观点是,没有所谓的“目标C函数”或“C++函数”。函数可以包含一些客观的C或C++特定的东西,但是对于符号本身来说没有区别。因此,你的问题的字面答案是“否”,但也许人们在答案中提到的一些变通方法会对你有所帮助。也许可以按照下面的思路编译
g++-Dverify=vrfy-Dcheck=chk…
,以便全局重新定义这些宏?(只是用<代码> G++< /COD>检查,这里只对重新定义进行抱怨。记住C++和目标C都是C的超集。你正在获得的符号是C函数或宏,而不是C函数或C++函数。我的观点是,没有所谓的“目标C函数”或“C++函数”。函数可以包含一些客观的C或C++特定的东西,但是对于符号本身来说没有区别。因此,你的问题的字面答案是“不”,但也许人们在答案中提到的一些变通方法会对你有所帮助。