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

How can I check if a cpp file is being compiled in an Objective-C++ project using the preprocessor?

我有一个 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 进行编译。

如果我的 .cpp 文件是在 Objective-C++ 项目或普通 C++ 项目中编译的,我如何使用预处理器检查?

问题是默认情况下,Xcode 通过扩展名而不是项目来确定文件类型,因此它认为 .cpp 文件是一个普通的 C++ 文件,即使它是 Objective-C++ 项目,所以它没有在该文件中定义 __OBJC__ 宏。解决方案是通过右键单击 Xcode 左侧文件列表中的 .cpp 文件来更改编译模式,单击 "Show File Inspector" 并在右侧的 "Type" 下拉列表中Xcode select "Objective-C++ Source" 的一侧而不是 "Default - C++ Source":

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

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


感谢Josh Caswell for giving me the idea in