【问题标题】:How can I check if a cpp file is being compiled in an Objective-C++ project using the preprocessor?如何检查是否正在使用预处理器在 Objective-C++ 项目中编译 cpp 文件?
【发布时间】:2018-01-24 07:30:02
【问题描述】:

我有一个 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++ 项目中编译的,如何使用预处理器检查?

【问题讨论】:

  • AFAIK,XCode 根据文件后缀确定语言,而不是根据项目类型。
  • 您可以在the File Inspector's "Type" dropdown中更改编译模式。这是每个项目的设置。
  • @JoshCaswell 谢谢。在“类型”的文件检查器中,我将“默认 - C++ 源代码”更改为“Objective-C++ 源代码”并且它有效。

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


【解决方案1】:

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

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

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


感谢Josh Caswellthis comment 中给了我这个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2012-03-13
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多