在预处理器#if #else的两个条件中突出显示XCode语法

时间:2015-04-07 17:11:19

标签: ios xcode preprocessor-directive

我的应用程序使用了一个不能在模拟器上构建和/或运行的库,所以我通过使用预处理程序指令来包含引用来有效地删除对该库的引用:

#if !(TARGET_IPHONE_SIMULATOR)
    //Do the real implementation
#else
    //Do a dummy implementation for testing

XCode自动检查以查看我当前的目标是什么,并评估#if /#else,我觉得这样很好。问题是,它会关闭语法高亮,自动完成等,无论哪种条件都不会被编译。 (例如,如果我当前的目标是模拟器,那么真实实现中的代码就会失去突出显示)

我的不好的解决方案是更改目标,以便我想要编辑的任何实现都会被激活'。有没有办法让它们始终保持高亮显示,以便我可以无缝编辑它们?

1 个答案:

答案 0 :(得分:3)

如果两个实现都将针对任一目标进行编译,那么您可以执行以下操作:

#if !(TARGET_IPHONE_SIMULATOR)
    const bool simulator = false;
#else
    const bool simulator = true;
#endif

    if (simulator)
    {
        //Do a dummy implementation for testing
    }
    else
    {
        //Do the real implementation
    }

两个分支都将被编译,尽管优化器应该丢弃一个永远不能用于给定目标的分支。

如果目标是模拟器,甚至无法构建使用库的代码,您可以执行以下操作:

#if !TARGET_IPHONE_SIMULATOR
    if (true)
    {
        //Do the real implementation
    }
    else
#endif
    {
        //Do a dummy implementation for testing
    }

在这种情况下,实际实现在定位模拟器时仍然不会被语法着色或支持完成,但两个分支都会在定位设备时具有这些功能。

您还可以为模拟器实现库的虚拟版本。您可以让它定义所有接口,但一切都只会返回失败甚至抛出异常。您可以在所有代码周围使用#if TARGET_IPHONE_SIMULATOR,以便库最终为设备构建完全为空。然后,您将链接到该并使用第一种方法。