4

来自Xcode 文档

语法高亮、代码完成和所有其他索引驱动的特性都由 LLVM 解析器处理。如果编译器知道符号,那么 Xcode IDE 也知道。

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

例子:

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

警告

里面的正确#if补全:

正确的代码完成

但是,里面的补全不正确#else

不正确的代码完成

它一半适用于局部变量:

UIDeviceOrientationIsPortrait 宏中的解析失败

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

UIDeviceOrientationIsPortrait 宏中的解析失败

另一个例子
另一个例子

谁能告诉我如何(或即使这可以解决?

4

3 回答 3

2

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

在此处输入图像描述

在此处输入图像描述

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

我提出了一个问题,询问如何让 XCode 在条件的两边都做所有这些事情,但到目前为止还没有运气。
XCode 语法在预处理器 #if #else 的两种情况下突出显示

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

于 2015-04-16T16:32:11.523 回答
1

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

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

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

#define UNUSED(a) a
...
-(void)test:(id)argument
{
    UNUSED(argument);
#ifdef AAA
    NSLog(@"arg:%@", argument);
#endif    
}
于 2011-11-10T13:19:52.520 回答
-1

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

于 2012-03-29T16:53:57.590 回答