关键字static对变量和函数的工作方式不同的确切原因是什么

时间:2014-09-01 09:29:39

标签: c memory static static-variables static-functions

如果我们在变量前面使用static,那么它的值在函数调用之间的程序执行的整个循环中保持不变。但是如果我们将static与函数一起使用,它们将成为声明它们的文件的本地。我知道这是方法,但我想知道原因究竟是什么原因?为什么静态表现有两种方式?我试过网但没运气,请解释一下!还请告诉我内存中静态函数的存储位置,我个人认为它是堆栈!

3 个答案:

答案 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中表示:

  • 内部联系。其他编译单元(=其他.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变量必须长寿,所以它们通常在程序的开头分配,因此它们不一定存在于堆栈中。