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

时间:2011-10-28 20:00:26

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

来自Xcode Docs

  

语法突出显示,代码完成以及所有其他索引驱动   功能由LLVM解析器处理。如果编译器知道a   符号,Xcode IDE也是如此。

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

示例:

在启用未使用参数警告的情况下构建时,即使使用了 参数,也会生成大量警告。此特定屏幕截图中的代码来自Apples Reachability.m,未经修改。请注意,此处也不存在语法突出显示:

Warnings

#if内完成完成:

Correct Code Completion

但是,#else

中的错误的完成

Incorrect Code Completion

它一半使用局部变量:

Broken Parsing in UIDeviceOrientationIsPortrait Macro

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

Broken Parsing in UIDeviceOrientationIsPortrait Macro

Another example
Another example

任何人都可以告诉我如何(甚至如果)可以修复这个问题吗?

3 个答案:

答案 0 :(得分:2)

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

enter image description here

enter image description here

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

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

对于记录我不认为这种行为是一个错误。我可以想象一下,如果在编译时遇到错误会非常令人沮丧。然而,能够在不必操纵宏定义的情况下编辑这些条件的两面是很好的。

答案 1 :(得分:1)

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

这也解释了为什么它“在#else中工作正常。”。

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

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

答案 2 :(得分:-1)

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