Xcode:宏破坏了自动补全/高亮功能

4

来自Xcode文档

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

但是在预处理指令内编写代码时,这些“索引驱动的功能”都无法正常工作。有人有解决方法吗?

示例:

当开启未使用参数警告进行构建时,即使该参数被使用,也会生成大量警告。此特定截图中的代码来自于苹果公司的Reachability.m,且未经修改。请注意,此处也不存在语法高亮:

Warnings

#if内部的正确完成:

Correct Code Completion

但是,在#else内部错误地完成:

Incorrect Code Completion

它与本地变量一半能够正常工作:

Broken Parsing in UIDeviceOrientationIsPortrait Macro

但是在调用当前方法范围外声明的内容时会再次出现错误:

Broken Parsing in UIDeviceOrientationIsPortrait Macro

另一个例子
另一个例子

请问有人可以告诉我如何(甚至是否)修复这个问题吗?


听起来像是一个等待被提交的雷达! :) - user557219
@Bavarious 我曾经考虑过这个问题,但后来我发现这在所有版本的Xcode中都会发生,无论使用哪个编译器,所以我想如果这是一个错误,肯定已经有人报告过了;如果不是错误,那么一定有人已经找到了解决方法。但如果我在这里得不到答案,我一定会去提交一个错误报告。 - chown
3个回答

2
XCode实际上会对预处理指令中的条件进行评估,并且只会对当前为真的条件下的代码进行高亮和补全。例如:

enter image description here

enter image description here

语法高亮、自动完成和警告(在这种情况下是未使用变量警告)在不真实的条件下不起作用。
我曾经提出了一个问题,询问如何让XCode在预处理器#if #else的两个条件中都执行这些功能,但目前还没有运气。
XCode syntax highlighting in both conditions of preprocessor #if #else 为记录,我并不认为这种行为是错误。我可以想象在编译代码时收到错误信息会非常令人沮丧。但是,能够编辑这些条件的两侧而无需操作宏定义将是很好的。

1

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

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

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

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

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

感谢您添加这个内容。遗憾的是,我卡在了4.2(雪豹终身使用者),但至少有一条通往理智的道路。 - poetmountain
3
我不能说这对所有人都适用。我在XCode 5.1中仍然遇到类似(或相同的)问题。我的情况可能有点不同,因为我有不同目标的头文件集合,每次更改目标都会搞乱它。清理/重建没有帮助,唯一的解决方法是重新启动XCode。 - jackal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接