Xcode:宏破坏完成/突出显示

Posted

技术标签:

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

来自Xcode Docs:

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

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

例子:

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

正确#if内完成:

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

它一半适用于局部变量:

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

Another exampleAnother example

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

【问题讨论】:

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

以上是关于Xcode:宏破坏完成/突出显示的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 编辑器:突出显示选定符号的实例

单击 Xcode 4.3.3 时保持 A 按钮突出显示

带有父选择器的 BEM 嵌套 SCSS 会破坏 Sublime Text 语法突出显示?

XCode 7.2 中的测试包中没有错误突出显示

如何比较两列之间的字符,并使用宏突出显示相同的单元格

自动设置在 XCode 中突出显示的选定 UI 按钮?