如果我们在变量前面使用静态,它的值在函数调用之间程序执行的整个周期内保持不变。但是,如果我们将 static 与函数一起使用,它们将成为声明它们的文件的本地文件。我知道这是方法,但我想知道究竟是为什么?为什么静态以两种方式表现?我试过net但没有运气,请解释一下!另外请告诉我静态函数将存储在内存中的哪个位置,我个人认为它在堆栈中!
3 回答
事实上,关键字static作为链接的说明符对函数和变量具有相同的含义,即使用关键字static声明的命名空间中的函数和变量具有内部链接。
来自 C++ 标准(3.5 程序和链接)
3 具有命名空间范围 (3.3.6) 的名称如果是以下名称,则具有内部链接 -显式声明为静态的变量、函数或函数模板
静态函数的存储方式与其他函数相同,只是它们的名称不作为外部名称导出。
此关键字为变量重载。它还表示静态存储持续时间。这就是你在帖子中所说的。
来自 C++ 标准(3.7.1 静态存储持续时间)
1 所有没有动态存储时长、没有线程存储时长、非本地变量都有静态存储时长。这些实体的存储应持续到程序的持续时间(3.6.2、3.6.3)。
3 关键字 static 可用于声明具有静态存储持续时间的局部变量。
4 在类定义中应用于类数据成员的关键字 static 给出了数据成员静态存储的持续时间。
C++ 中关键字 static 相对于类的成员还有第三种含义(在 C 中没有类,因此这对 C 无效)。
1 类的数据或函数成员可以在类定义中声明为静态,在这种情况下,它是类的静态成员。
我没有足够的声誉来评论它。所以写在这里。
引用“Expert C Programming - Peter van der Linden”一书中的几行内容可能会回答您的问题。
一个问题是 C 太简洁了。仅仅添加、更改或省略单个字符通常会给您一个仍然有效但执行完全不同的操作的程序。更糟糕的是,许多符号被“重载”——在不同的上下文中使用时具有不同的含义。甚至一些关键字被重载了几个含义,这就是 C 范围规则对程序员来说不是直观清晰的主要原因。
static :在函数内部,在调用之间保留其值;在函数级别,仅在此文件中可见
extern :应用于函数定义,具有全局范围(并且是多余的);应用于在别处定义的变量
所以我的意思是这些是语言的一些缺陷。不确定这是否有帮助。
在 Cstatic
中意味着:
- 内部联动。对象对其他编译单元不可见(= 其他 .c 文件)。
- 对象存在到程序结束。
对象是变量还是函数都没有关系。
请注意,static
可以限制变量的范围。
static void A(void);
static int B;
void test(void) {
static int C = 0;
// A, B and C visible
}
void test2(void) {
// Only A and B visible
}
因为static
变量必须长期存在,它们通常在程序开始时分配,所以它们不一定存在于堆栈中。