我有一个C ++源文件(.cpp),它在我的两个项目之间共享,一个使用Objective C ++,另一个使用普通的C ++。我有一个文件的一部分,我需要为Objective C ++项目和普通的C ++项目使用不同的代码,所以我需要检查是否正在使用Objective C ++编译项目。经过一些搜索,我发现__OBJC__
宏可用于检查文件是否由Objective C编译器编译,所以我尝试了这段代码:
#ifdef __OBJC__
//Objective C++ specific code here
#else
//Plain C++ specific code here
#endif
问题是永远不会定义__OBJC__
宏,即使在Objective C ++项目中也是如此。我还注意到__OBJC__
宏在Objective C ++项目的.mm文件中定义,但不在.cpp文件中定义。
如果重要,我正在使用XCode编译iOS的Objective C ++项目,而普通的C ++项目是一个跨平台的计算机程序,可以使用Visual Studio,XCode或GCC进行编译。
如果在Objective C ++项目或普通C ++项目中编译我的.cpp文件,如何使用预处理器进行检查?
答案 0 :(得分:1)
问题在于,默认情况下,XCode通过扩展而不是项目来确定文件类型,因此它认为.cpp文件是一个普通的C ++文件,即使它是Objective C ++项目的一部分,所以它没有在该文件中定义__OBJC__
宏。解决方案是通过右键单击XCode左侧文件列表中的.cpp文件来更改编译模式,单击“显示文件检查器”,然后在XCode右侧的“类型”下拉列表中选择“目标” -C ++ Source“而不是”Default - C ++ Source“:
这将使XCode认为.cpp文件是一个Objective C ++文件,因此它将定义__OBJC__
宏。
由于这是一个每个项目的设置,它只对Objective C ++项目有影响,并且不会改变普通C ++项目中的任何内容,因此#ifdef __OBJC__
将是一种检查文件所在项目的方法汇编成。
感谢Josh Caswell在this comment中向我提供了这个想法。