gpt4 book ai didi

c - C中未命名范围的成本是多少?

转载 作者:太空狗 更新时间:2023-10-29 15:54:23 27 4
gpt4 key购买 nike

我之前玩过 C++,我在想是否在某些情况下,因为我的 C 编译器拒绝让我编写如下代码:

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

我试着写这样的东西:

#include <stdio.h>

int main(int argc, char **argv)
{
{
int i;
for (i = 0; i < 30; ++i) {
printf("%d.\n", i);
}
}

return 0;
}

结果是我的作用域中没有这个 i 变量超出我的需要,并释放 i 以用于主作用域中的其他目的(我不会对 i 这样做,因为按照惯例它是迭代器)。所以我可以写一些愚蠢的代码,比如:

#include <stdio.h>

int main(int argc, char **argv)
{
int i = 3;

/* my loop scope. */
{
int i;
for (i = 0; i < 30; ++i) {
printf("%d.\n", i);
}
}
printf("i remains intact! %d.\n", i);

return 0;
}

同样,我不会故意让真正的代码像这样滥用我,但在很多情况下,尤其是处理 libc 函数调用中必需的临时变量,例如 sem_getvalue或 Windows API FormatMessage ,其中很容易用许多临时变量弄乱范围,并对正在发生的事情感到困惑。通过使用未命名范围,理论上,我可以通过将这些临时变量隔离到未命名范围来降低代码的复杂性。

这个想法看似愚蠢但很有说服力,我很好奇以这种风格编写代码是否有任何成本/缺点。以这种方式编写代码是否存在固有问题,或者这是一种体面的做法?

最佳答案

{
int x = 3;
{
int y = 4;
int sum = x+y;
}
}

成本不超过:

{
int x = 3;
int y = 4;
int sum = x+y;
}

因为大括号本身不会翻译成任何机器代码,所以它们只是用来告诉编译器有关作用域的信息。

您的变量具有相同名称的事实也没有影响,因为变量名称也仅供编译器使用,不会更改机器代码。

关于c - C中未命名范围的成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341151/

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