gpt4 book ai didi

c - 我如何让 Xcode 考虑我定义的值?

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:06 24 4
gpt4 key购买 nike

如何让 Xcode 考虑我定义的值以正确折叠我的代码? Xcode 似乎考虑了一些没有作为代码的一部分编译的东西——这给我带来了一些问题:(

例子:

#include <stdio.h>

#define LIE_TO_THE_USER 1

void foobar(int argc)
{ // A
#if LIE_TO_THE_USER
if (0) { // B
#else
if (argc > 0) { // C
#endif
printf("argc is greater than 0\n");
} // D
else
{ // E
printf("argc is not greater than 0\n");
} // F
} // G

int main(int argc, const char * argv[])
{
foobar(argc);
return 0;
}

这段代码可以编译……但是使用起来很痛苦。

就 Xcode 而言,它将括号 C 和 D 折叠在一起,将 E 和 F 折叠在一起,并将 C 和 G 折叠在一起(而不是折叠 A 和 G)。此外,在 #if#else #endif 之后声明的任何内容(因此只有 main 是这种情况)在这种情况下不会显示。

在 Visual Studio 中,它只会使 if (argc> 0 ) {//C 变灰并忽略它。但 Xcode 似乎将其视为代码的一部分。我找到了 2 个解决方法:

void foobar(int argc)
{
#if LIE_TO_THE_USER
if (0)
#else
if (argc > 0)
#endif
{
printf("argc is greater than 0\n");
}
else
{
printf("argc is not greater than 0\n");
}
}

/// OR

void foobar(int argc)
{
#if LIE_TO_THE_USER
if (0) {
#else
if (argc > 0) {
#endif
printf("argc is greater than 0\n");
}
else
{
printf("argc is not greater than 0\n");
}
#if 0
}
#endif
}

但是,这个问题在我的项目中非常频繁。所以我想找到自动解决这个问题的方法,而不必担心添加变通方法。有谁知道配置 Xcode 以忽略诸如 if (argc > 0) {?

之类的行的方法

提前致谢:)

最佳答案

这是宏可怕的原因之一;您可以任意扰乱 token 流,并且不必遵守语言的结构。

Visual Studio 完全忽略预处理器吃掉的任何内容,这意味着它可靠地理解当前定义下的代码结构,但不理解被禁用的代码。 Xcode 正试图变得更聪明并理解整个程序,但是当您使用真正颠覆语言结构的宏时,这种方法效果不佳。

C++ 对于工具来说已经足够难用了,而预处理器的基本性质使它变得更糟,因为它本质上使相同的 C++ 源代码可以生成任意多的程序。您可以通过尽量减少预处理器的使用并将使用限制为最简单和最常规的方式来避免此问题,以便工具很可能理解它们。


在这种情况下,我想我会选择类似的东西:

void foobar(int argc)
{
static constexpr bool tell_the_truth = false;

if (tell_the_truth && argc > 0)
{
printf("argc is greater than 0\n");
}
else
{
printf("argc is not greater than 0\n");
}
}

或者,如果您希望能够通过编译命令进行配置,您可以使用:

static constexpr bool tell_the_truth = !LIE_TO_THE_USER

这样您就可以使用诸如 -DLIE_TO_THE_USER=true-DLIE_TO_THE_USER=false 之类的标志。

这种方法的好处是工具对该程序的理解,即 AST,实际上代表了预期的程序,并且不会在配置之间发生根本性的变化。

关于c - 我如何让 Xcode 考虑我定义的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com