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

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

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

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

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

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

 #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 } 

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

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