c和c ++之间关键字static的区别是什么?

时间:2013-12-20 07:17:47

标签: c++ c static

我知道c中的关键字有两种用法:

  • 修改变量

    • 修改全局变量

      这种用法限制了全局变量范围从定义点到文件末尾的范围。

    • 修改局部变量

      这种用法限制了定义的函数中局部变量的范围,但也保留在内存的静态区域

  • 修改功能

    这意味着只能调用它定义的文件中的函数。

并且在c ++中,除了c中的用法之外,static还用于修改类的数据成员和函数成员。此用法限制属于该类的成员而不是该类的对象。

我想知道c / c ++中有static的其他用法吗?

3 个答案:

答案 0 :(得分:5)

static可能是C和C ++中最容易混淆的重载关键字。它意味着不同的地方有不同的东西。

  • 在函数中,static存储类,表示程序生命周期中存在的变量。所以说

    void f() {
        static int i = 0;
    }
    

    表示在i的调用之间保留f()的值。其他存储类是C11 / C ++中的默认auto(但要注意C ++ 11中含义的变化),externregister以及thread_local 11。

  • 在文件范围(或C ++中的命名空间范围)中,static链接说明符。以这种方式标记为static的函数和变量具有内部链接,因此当前转换单元是本地的。这意味着像

    这样的功能
     static int f() {
         return 3;
     }
    

    只能由同一.c文件中的其他函数引用。在C ++ 03中不推荐使用static,而使用未命名的命名空间。我在某个地方看过它在C ++ 11中再次未被提及。

  • 在C ++中,当应用于类的成员函数或成员变量时,意味着函数或变量不需要类实例才能被访问。除了C ++类访问说明符适用于成员之外,“类静态”成员函数/变量和全局函数/变量在实现方面几乎没有什么不同。

  • 最后一个:在C99(但不是C ++)中,static可以在数组函数参数中使用,如下所示:

    void f(int a[static 4]) {
    }
    

    这指定参数a必须是一个大小至少为4的整数数组。

我认为这就是全部,但如果有任何我忘记的话,请在评论中告诉我们。

答案 1 :(得分:2)

静态在C语言系列中,静态变量是在编译的生命周期中存在的变量 单位(源文件或模块)。静态变量可以在模块范围内声明,因此可以 由同一源文件中定义的所有函数访问。这样的静态变量不能 可以直接从其他模块访问,但内部模块API可以将指针传递给静态变量和 通过指针修改那些。静态变量也可以在函数体内声明,其中 通常的范围规则适用。函数内声明的静态变量仅在初始化时初始化 初始化模块(通常在应用程序加载时),并将其值保留为多个 调用包含定义的函数。

在C ++中,静态变量也可以是类定义的成员。访问静态成员  变量由标准访问修饰符(private,public,protected)管理,但是所有实例都是 此类共享相同的静态变量,并共享相同的值。修改此变量的值 影响班级的所有对象。易失性volatile关键字是不同的东西,而不是任何方式 与静态相反。静态变量可以或可以不被声明为volatile,就像全局变量或局部变量一样  可。 volatile关键字是一个提示,通知编译器变量的值 可能会在没有编译器知识的情况下改变。因此,编译器的代码优化器无法做出假设 关于变量的当前值,并且必须始终(重新)读取变量的内容。

答案 2 :(得分:0)

参考c ++ - > static关键字可用于声明变量,函数,类数据成员和类函数。

以下是不同情景中的常见用法(ref from MSDN

  • 在文件范围(全局和/或命名空间范围)声明变量或函数时,static关键字指定变量或函数具有内部链接。声明变量时,变量具有静态持续时间,编译器将其初始化为0,除非您指定另一个值。

  • 在函数中声明变量时,static关键字指定变量在对该函数的调用之间保持其状态。

  • 在类声明中声明数据成员时,static关键字指定该类的所有实例共享该成员的一个副本。必须在文件范围定义静态数据成员。您声明为const static的整数数据成员可以具有初始化程序。

  • 在类声明中声明成员函数时,static关键字指定该函数由该类的所有实例共享。静态成员函数无法访问实例成员,因为该函数没有隐式this指针。要访问实例成员,请使用作为实例指针或引用的参数声明该函数。

  • 您不能将union的成员声明为static。但是,必须将全局声明的匿名联合声明为静态声明。

还检查以下内容:
The static keyword and its various uses in C++

static keyword usage