如何使用预处理器检查是否在Objective C ++项目中编译了cpp文件?

时间:2017-08-16 08:32:40

标签: c++ objective-c macros c-preprocessor objective-c++

我有一个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文件,如何使用预处理器进行检查?

1 个答案:

答案 0 :(得分:1)

问题在于,默认情况下,XCode通过扩展而不是项目来确定文件类型,因此它认为.cpp文件是一个普通的C ++文件,即使它是Objective C ++项目的一部分,所以它没有在该文件中定义__OBJC__宏。解决方案是通过右键单击XCode左侧文件列表中的.cpp文件来更改编译模式,单击“显示文件检查器”,然后在XCode右侧的“类型”下拉列表中选择“目标” -C ++ Source“而不是”Default - C ++ Source“:

enter image description here

这将使XCode认为.cpp文件是一个Objective C ++文件,因此它将定义__OBJC__宏。

由于这是一个每个项目的设置,它只对Objective C ++项目有影响,并且不会改变普通C ++项目中的任何内容,因此#ifdef __OBJC__将是一种检查文件所在项目的方法汇编成。

感谢Josh Caswellthis comment中向我提供了这个想法。