我知道c中的关键字有两种用法:
修改变量
修改全局变量
这种用法限制了全局变量范围从定义点到文件末尾的范围。
修改局部变量
这种用法限制了定义的函数中局部变量的范围,但也保留在内存的静态区域
修改功能
这意味着只能调用它定义的文件中的函数。
并且在c ++中,除了c中的用法之外,static
还用于修改类的数据成员和函数成员。此用法限制属于该类的成员而不是该类的对象。
我想知道c / c ++中有static
的其他用法吗?
答案 0 :(得分:5)
static
可能是C和C ++中最容易混淆的重载关键字。它意味着不同的地方有不同的东西。
在函数中,static
是存储类,表示程序生命周期中存在的变量。所以说
void f() {
static int i = 0;
}
表示在i
的调用之间保留f()
的值。其他存储类是C11 / C ++中的默认auto
(但要注意C ++ 11中含义的变化),extern
和register
以及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。但是,必须将全局声明的匿名联合声明为静态声明。