【问题标题】:Xcode: macros breaking completion/highlightingXcode:宏破坏完成/突出显示
【发布时间】:2011-10-28 20:00:25
【问题描述】:

来自Xcode Docs

语法高亮、代码完成和所有其他索引驱动 功能由 LLVM 解析器处理。如果编译器知道一个 符号,Xcode IDE 也是。

但在预处理器指令中编写代码时,这些“索引驱动的功能”都不适用于我。有人对此有解决方案吗?

例子:

在打开未使用参数警告的情况下构建时,即使使用了上述参数,也会生成大量警告。此特定屏幕截图中的代码来自 Apples Reachability.m,未经修改。注意这里也没有语法高亮:

正确#if内完成:

但是,不正确#else中完成:

它一半适用于局部变量:

但在调用当前方法范围之外声明的内容时再次中断:

Another example
Another example

谁能告诉我如何(甚至如果)这可以解决?

【问题讨论】:

  • 听起来像 radar 等待归档! :)
  • @Bavarious 我想过这个问题,但后来我发现这发生在任何编译器的所有版本的 xcode 中,所以我想有人必须已经报告它(如果这是一个错误)和如果不是错误,那么一定有人想出了如何修复它。如果我在这里没有得到修复的答案,我肯定会提交一个。

标签: xcode parsing syntax-highlighting code-completion preprocessor-directive


【解决方案1】:

XCode 实际上评估预处理器指令上的条件,并且只对当前真实条件内的代码进行突出显示/完成。例如

语法高亮、自动完成和警告(在这种情况下为未使用的变量警告)在不真实的情况下不起作用。

我打开了一个问题,询问如何让 XCode 在条件的两边都做所有这些事情,但到目前为止还没有运气。
XCode syntax highlighting in both conditions of preprocessor #if #else

为了记录,我不认为这种行为是一个错误。我可以想象在无法编译的代码上出现错误会非常令人沮丧的情况。但是,如果能够编辑这些条件的两边而不必操作您的宏定义,那就太好了。

【讨论】:

    【解决方案2】:

    @chown,我认为“如果编译器知道一个符号......就像它们在构建时一样。”表示编译器解析代码并遵循所有预处理器条件。在这种情况下,编译器不会注意到条件失败的 #ifdef 内的变量使用情况。

    这也解释了为什么它“在#else 中运行良好。”。

    您可以尝试使用 UNUSED 宏,但您必须禁用“未使用值”的警告:

    #define UNUSED(a) a
    ...
    -(void)test:(id)argument
    {
        UNUSED(argument);
    #ifdef AAA
        NSLog(@"arg:%@", argument);
    #endif    
    }
    

    【讨论】:

      【解决方案3】:

      原来这是一个错误,现在已在 Xcode 版本 4.3.1 (4E1019) 中修复。

      【讨论】:

      • 感谢您添加此内容。可悲的是,我被困在 4.2 (Snow Leopard For Life),但至少有一条通向理智的道路。
      • 我不能说它对所有人都是固定的。我在 XCode 5.1 中仍然遇到类似(或相同)的问题。我的情况可能有点不同,我为不同的目标收集了不同的标头,并且每次更改目标都会搞砸。清洁/重建没有帮助。唯一的解决方案是重新启动 XCode。
      猜你喜欢
      • 1970-01-01
      • 2018-03-06
      • 2018-04-19
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2016-02-25
      相关资源
      最近更新 更多