在 Cstatic
中可以表示局部变量或没有外部链接的全局函数/变量。在 C++ 中,它也可以表示每个类的成员变量或成员函数。
有没有提到static
似乎与缺乏外部链接完全无关的关键字被用来表示缺乏外部链接是如何发生的?
使用已经存在的关键字的优点是不会向语言添加新关键字,这可能会破坏现有程序。它可能会令人困惑,但它被认为是一种“较小的邪恶”。
我假设您认为使用 static 来定义在函数调用之间保留其值的变量是很自然的。
考虑以下:
void func() {
static int x;
}
相对
int x;
void func() {
}
从func
的角度来看,x
在任何一种情况下都表现相同。该值在连续调用之间保持不变。两者的区别在于谁能看到x
。首先,没有人可以。第二,每个人都可以。
该概念扩展到全局范围内的静态变量。如果你只是声明一个变量,每个人都可以看到它。但是,如果您将该变量声明为静态,则只有该文件可以看到它。显然,您必须考虑到没有额外的范围来限制可见性,但想法就在那里。
C++ 中关于静态成员的附加含义也直接类似于原始示例。由类的所有实例共享的单个变量。
static
是一个存储说明符。“静态”这个词意味着不变。“存储”是指对象在内存中的位置,即它的地址。
具有static
存储的对象驻留在恒定地址。
碰巧一个有extern
存储的对象也有一个常量地址。由于 C 和 C++ 程序的链接方式,这是必要的。而且因为extern
恰好是最不令人惊讶的行为,所以它也是默认的。
如果您将其extern
视为 . 之上的额外功能static
,我认为它更有意义。声明一个函数有点愚蠢static
,因为在任何完全编译的语言中都没有其他选择,但是函数的地址是静态的,即使它在外部不可见。
那么,真正不一致的部分是必须声明在不同编译单元之间共享的类成员static
,而不是extern
......</p>
C 版本意味着在函数之外“静态链接”。
C++ 类版本和 C 内部函数版本意味着“静态存储”,这意味着它们不是auto
(堆栈或本地)变量或类中的实例变量。