XCode 语法在预处理器 #if #else 的两种情况下突出显示

Posted

技术标签:

【中文标题】XCode 语法在预处理器 #if #else 的两种情况下突出显示【英文标题】:XCode syntax highlighting in both conditions of preprocessor #if #else 【发布时间】:2015-04-07 17:11:18 【问题描述】:

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

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

XCode 会自动检查我当前的目标是什么,并评估 #if/#else,我猜这有点不错。问题是,对于不编译的任何条件,它都会关闭语法突出显示、自动完成等。 (例如,如果我当前的目标是模拟器,则实际实现中的代码将失去高亮)

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

【问题讨论】:

【参考方案1】:

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

#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,这样库最终对于设备构建完全是空的。然后,您将链接到该链接并使用第一种方法。

【讨论】:

感谢您的回答!我编辑了我的帖子,以澄清该库不会建立在模拟器上,所以我不能做第一个解决方案,但答案很好;有很大帮助

以上是关于XCode 语法在预处理器 #if #else 的两种情况下突出显示的主要内容,如果未能解决你的问题,请参考以下文章

if else 为预处理器定义

C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif

#define 预处理器指令可以包含 if 和 else 吗?

R语言switch语句语法实战:Switch语句用来处理嵌套的if else处理起来比较困难或者麻烦的条件判断问题

前端—— JavaScript基础操作:if语句for循环while循环for...infor...of异常处理函数事件JS选择器JS操作页面样式

Xcode 6.1 if/else/for/switch 语句不自动完成(仅限 Swift)