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

发布于 2024-12-12 19:54:30 字数 1568 浏览 0 评论 0原文

来自 Xcode 文档

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

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

示例:

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

Warnings

正确 #if 内完成:

正确的代码完成

但是,#else不正确完成:

错误的代码完成

它一半适用于局部变量:

解析损坏UIDeviceOrientationIsPortrait Macro

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

UIDeviceOrientationIsPortrait 宏中的解析损坏

另一个示例
另一个例子

任何人都可以告诉我怎么做吗(或者甚至如果)这可以修复吗?

From the Xcode Docs:

Syntax highlighting, code completion, and every other index-driven
feature is handled by the LLVM parser. If the compiler knows about a
symbol, so does the Xcode IDE.

but none of these "index-driven features" are working for me when writing code inside of a preprocessor directive. Does anyone have a solution for this?

Examples:

When building with Unused Parameter warnings turned on, tons of warnings are generated even when said parameter is used. The code in this specific screenshot is from Apples Reachability.m and is unmodified. Notice that syntax highlighting is also nonexistent here:

Warnings

Correct completion inside #if:

Correct Code Completion

But, incorrect completion inside #else:

Incorrect Code Completion

It half works with local variables:

Broken Parsing in UIDeviceOrientationIsPortrait Macro

But breaks again when calling something declared outside of the current method scope:

Broken Parsing in UIDeviceOrientationIsPortrait Macro

Another example
Another example

Can anyone please tell me how (or even if) this can be fixed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白云悠悠 2024-12-19 19:54:33

事实证明这是一个错误,现已在 Xcode 版本 4.3.1 (4E1019) 中修复。

Turns out this was a bug and is now fixed in Xcode Version 4.3.1 (4E1019).

青衫儰鉨ミ守葔 2024-12-19 19:54:32

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

在此处输入图像描述

在此处输入图像描述

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

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

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

XCode actually evaluates the conditions on preprocessor directives and only does highlighting/completing for the code inside the currently true condition. For example

enter image description here

enter image description here

Syntax highlighting, autocompletion, and warnings (unsused variable warning in this case) don't work in the untrue condition.

I opened a question asking how to make XCode do all these things on both sides of the condition, but no luck so far.
XCode syntax highlighting in both conditions of preprocessor #if #else

For the record I do not think this behavior is a bug. I can imagine cases where it would be extremely frustrating to be getting errors on code that won't be compiled. It would however be nice to be able to edit both sides of these conditions without having to manipulate your macro definitions.

烛影斜 2024-12-19 19:54:32

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

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

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

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

@chown, I think "If the compiler knows about a symbol...exactly as they are when building." indicate that compiler parses the code and follow the all preprocessor conditions. In such case, compiler will not notice variable usage inside of such #ifdef where condition has failed.

This also explains why it is "works fine in the #else.".

You can try to use UNUSED macro, but you will have to disable warning for "Unused values":

#define UNUSED(a) a
...
-(void)test:(id)argument
{
    UNUSED(argument);
#ifdef AAA
    NSLog(@"arg:%@", argument);
#endif    
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文