如果我们在变量前面使用static,那么它的值在函数调用之间的程序执行的整个循环中保持不变。但是如果我们将static与函数一起使用,它们将成为声明它们的文件的本地。我知道这是方法,但我想知道原因究竟是什么原因?为什么静态表现有两种方式?我试过网但没运气,请解释一下!还请告诉我内存中静态函数的存储位置,我个人认为它是堆栈!
答案 0 :(得分:2)
实际上,当关键字static用作链接的说明符时,关键字static与函数和变量具有相同的含义,函数和变量在使用关键字static声明的命名空间中具有内部链接。
来自C ++标准(3.5程序和链接)
3具有命名空间范围(3.3.6)的名称具有内部链接(如果是) 名称 - 变量,函数或函数模板即 明确声明静态
静态函数的存储方式与其他函数的存储方式相同,只是它们的名称不会作为外部名称导出。
此变量重载此关键字。它还表示静态存储持续时间。这就是你在帖子中所说的内容。
来自C ++标准(3.7.1静态存储持续时间)
1所有没有动态存储持续时间的变量都没有 有线程存储持续时间,并且不是本地有静态存储 持续时间。这些实体的存储应持续一段时间 该计划(3.6.2,3.6.3)。
3关键字static可用于声明局部变量 静态存储时间。
4关键字static应用于类中的类数据成员 definition为数据成员提供静态存储持续时间。
C ++中关键字static的第三个含义是相对于类的成员(在C中没有类,因此这对C无效)。
1类的数据或函数成员可以在a中声明为static 类定义,在这种情况下,它是类的静态成员。
答案 1 :(得分:2)
我没有足够的声誉来评论它。所以写在这里。
引用书中的几行"专家C编程 - 彼得范德林登"可能会回答你的问题。
一个问题是C是如此简洁。只需添加,更改或省略单个字符即可 一个仍然有效但完全不同的程序。更糟糕的是,许多符号都是 "重载" - 在不同的环境中使用时给予不同的含义。甚至一些关键词也是 超载了几个含义,这是C范围规则不直观清晰的主要原因 给程序员。
static:在函数内部,在调用之间保留其值; 在功能级别,仅在此文件中可见
extern:应用于函数定义,具有全局范围(并且是冗余的); 应用于其他地方定义的变量
所以我想说的是这些是语言的一些陷阱。不确定这是否有帮助。
答案 2 :(得分:1)
在C static
中表示:
如果对象是变量或函数,则无关紧要。
请注意,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
变量必须长寿,所以它们通常在程序的开头分配,因此它们不一定存在于堆栈中。