怎么会发生"静态"表示在C和C++中没有外部链接的函数/变量?

sha*_*oth 8 c c++ static linkage

在C中static可以表示局部变量或没有外部链接的全局函数/变量.在C++中,它还可以表示每类成员变量或成员函数.

有没有提及如何static使用与缺乏外部联系完全无关的关键词来表示缺乏外部联系?

Fra*_*sco 6

使用现有关键字的优点是不会在语言中添加新关键字,这可能会破坏现有程序.它可能令人困惑,但它被认为是一种"较小的邪恶".

  • 和许多C++关键字一样,static具有依赖于上下文的含义. (3认同)

Den*_*ose 6

我假设你考虑使用static来定义在函数调用之间保持其值的变量是自然的.

考虑以下:

void func() {
    static int x;
}
Run Code Online (Sandbox Code Playgroud)

int x;
void func() {
}
Run Code Online (Sandbox Code Playgroud)

func观点来看,x两种情况都表现相同.连续调用之间的值仍然存在.两者之间的区别是谁还能看到x.在第一个,没有人可以.在第二,每个人都可以.

该概念扩展到全局范围内的静态变量.如果你只是声明一个变量,那么每个人都可以看到它.但是如果你声明该变量是静态的,那么只有那个文件可以看到它.显然,你必须考虑到没有额外的范围来限制可见性,但这个想法就在那里.

C++中关于静态成员的附加含义也与原始示例直接类似.由类的所有实例共享的单个变量.


Pot*_*ter 4

static是一个存储说明符。“静态”这个词的意思是不变的。“存储”是指对象在内存中的位置,即它的地址。

\n\n

具有存储空间的对象static驻留在恒定地址处。

\n\n

恰巧一个有extern存储空间的对象也有一个常量地址。由于 C 和 C++ 程序的链接方式,这是必要的。因为extern它恰好是最不令人惊讶的行为,所以它也是默认行为。

\n\n

如果您将其视为extern之上的额外功能static,我认为这更有意义。声明一个函数有点愚蠢static,因为在任何完全编译的语言中都没有其他选择,但函数的地址静态的,即使它不是外部可见的。

\n\n

那么,真正不一致的部分是必须声明在不同编译单元之间共享的类成员static,而不是extern\xe2\x80\xa6

\n