gpt4 book ai didi

c - "#define for if (false) {} else for"的可能用途是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:19:23 32 4
gpt4 key购买 nike

在另一个问题中,我刚刚发现了这颗 C 智慧的小珍珠:

#define for if (false) {} else for

这导致 MSVC 为一个非常有效的语句发出“常量表达式”警告:

for (int i = 0; i <= 10; i++) {...}

我理解 为什么 MSVC 提示,因为它扩展到:

if (false) {} else for (int i = 0; i <= 10; i++) {...}

我只是不明白为什么开发人员会使用那个小片段。有人有想法吗?

最佳答案

这是为了修复旧版本 Visual C++(v6.0 及更早版本)中的错误。过去,Visual C++ 违反了关于在 for 语句中声明的变量的作用域规则:

// This compiles in old versions of Visual C++, but it is in fact INVALID C++
for(int i = 0; ...)
{
...
}

for(i = 0; ...)
{

}

换句话说,Visual C++ 为 i 提供了一个作用域,就好像它是在循环外部声明的一样,它允许您在循环完成后继续使用它。这导致代码如上面的片段。在更多符合标准的编译器中,i 不再在第二个 for 循环的定义范围内,因此编译器发出有关 i 未定义。

为了解决这个问题,有些人使用了这个宏(或非常相似、等效的宏):

#define for if(0) {} else for

这会将 for 循环更改为:

if(0)
{
}
else
for(int i = 0; ...)
{
...
}

这将 for 循环置于额外的作用域级别,因此无论 Visual C++ 的错误如何,在 for 循环中声明的任何变量都将超出作用域.这可确保相同的代码在 Visual C++ 和符合标准的编译器中都能正确编译,并且不正确的代码不会始终正确编译。

另请注意,如果宏定义为这样:

// DO NOT USE
#define for if(1) for

那么虽然对于一些简单的代码会有同样的效果,但是它会突然导致下面的代码编译错误:

if(foo)
for(...)
{
...
}
else
doSomething();

因为如果展开宏,您会得到:

if(foo)
if(1)
for(...)
{
...
}
else
doSomething();

else 现在与错误的 if 匹配!因此,巧妙地使用 if(0) {} else 而不是 if(1) 可以避免这个问题。

作为最后的说明,#define for if(0) {} else for 不会导致无限递归,因为预处理器不会递归地替换您当前定义的宏。在这种情况下,它只会进行一次替换。

关于c - "#define for if (false) {} else for"的可能用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/984878/

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