gpt4 book ai didi

c - C 中的内部静态变量,你会使用它们吗?

转载 作者:太空狗 更新时间:2023-10-29 16:25:28 27 4
gpt4 key购买 nike

在 C 中,您可以拥有在文件中的每个位置都可见的外部静态变量,而内部静态变量仅在函数中可见,但是是持久的

例如:

#include <stdio.h>

void foo_bar( void )
{
static counter = 0;
printf("counter is %d\n", counter);
counter++;
}
int main( void )
{
foo_bar();
foo_bar();
foo_bar();
return 0;
}

输出将是

counter is 0
counter is 1
counter is 2

我的问题是为什么要使用内部静态变量?如果您不希望您的静态变量在文件的其余部分可见,那么函数真的不应该在它自己的文件中吗?

最佳答案

这种混淆通常是因为 static 关键字有两个目的。

当在文件级别使用时,它控制编译单元之外的对象的可见性,而不是对象的持续时间(可见性和持续时间是我使用的外行术语在教育类(class)中,ISO 标准使用不同的术语,您最终可能想学习这些术语,但我发现它们会使大多数初学者感到困惑。

在文件级别创建的对象已经根据它们在文件级别的事实决定了它们的持续时间。 static 关键字只会使它们对链接器不可见。

在函数内部使用时,它控制持续时间,而不是可见性。可见性已经确定,因为它在函数内部——在函数外部是看不到的。在这种情况下,static 关键字导致对象与文件级对象同时创建。

请注意,从技术上讲,函数级静态可能在函数首次调用之前不一定存在(这对于 C++ 及其构造函数可能有意义),但我使用过的每个 C 实现都会创建其函数级静态同时作为文件级对象。

另外,虽然我使用“对象”这个词,但我并不是指 C++ 对象的意思(因为这是一个 C 问题)。这只是因为 static 可以应用于文件级别的变量或函数,我需要一个包罗万象的词来描述它。

函数级静态变量仍然被大量使用——如果不满足它们,它们可能会在多线程程序中造成麻烦,但是,如果您知道自己在做什么(或者您没有线程化),它们就是跨多个函数调用保留状态同时仍提供封装的最佳方式。

即使使用线程,您也可以在函数中执行一些技巧(例如在函数分配线程特定数据)以使其在不不必要地暴露函数内部的情况下工作。

我能想到的唯一其他选择是全局变量和每次将“状态变量”传递给函数。

在这两种情况下,您都将函数的内部工作原理暴露给它的客户,并使函数依赖于客户的良好行为(这总是一个冒险的假设)。

关于c - C 中的内部静态变量,你会使用它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534735/

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