static关键词
来源:互联网 发布:淘宝待发货订单隐藏 编辑:程序博客网 时间:2024/05/21 17:57
static的用法可以概括为如下三个问题:
1,static函数和普通函数有什么区别?
2,static全局变量和普通全局变量有什么区别?
3,static局部变量和普通局部变量有什么区别?
上面这个三个问题也恰好反映了static三个修饰对象,函数,全局变量
和局部变量。
---------------------------------------------------------------------
一,static函数和普通函数有什么区别?(static主要用来限制作用域)
C语言中函数有内部函数和外部函数之分。内部函数只能被在本文件
内调用,也就是函数的作用域被指定了。而外部函数是没有指定作用域的。
如果函数什么都没有加,也就是默认情况下是外部函数。
在内核里面有很多函数只供内部使用,故可以将其声明为内部函数,而供外
部提供接口的函数就不用声明为内部函数。例如:内核红黑树的实现。
左旋,右旋的实现就是供内部使用的。声明为内部函数。
而插入操作是向外部提供接口,故是外部函数。
必要的时候声明为内部函数有什么好处呢?
1,可以避免重命名的问题。
内核代码这么多,很容易就遇到了重命名问题,如果声明为内部函数
即使出现重命名,编译器也不会报错。
2,可以提高代码的健壮性。
有些内部函数指定了作用域相对于对外是透明的,外面就调用不了。
所以可以避免代码的错宗复杂引发的错误。
例如:
file1.c:
file2.c
将这两个文件放在一起编译也不会出错,尽管有函数重名,但使用static限制了作用域。
----------------------------------------------------------------------
二,static全局变量和普通全局变量有什么区别?(static主要用来限制作用域)
假如现在在一个文件里面定义了一个全局变量,要在另外一个文件里面引用。
该如何引用呢?static修饰的全局变量在别的文件是不可见的,而在本文件是可见
的,这和static修饰函数的作用差不多,可以见上面的例题。
全局变量的空间的开辟在静态区,加static修饰后仍然在静态区。唯一有变化的
就是作用域,加static作用域限定在本文件,不加static的全居变量作用域为整个
源程序。
用static修饰的变量位于静态区,那静态区又在哪儿呢?我也没有确定的答案。
个人看法,静态区=数据段+BSS段,静态区主要用来区分栈的。
用户态内存示意图:
------------------------------------------------------------------------
三,static局部变量和普通局部变量有什么区别?(主要用于设置存储属性的)
普通局部变量随函数的调用而开辟空间,随函数执行完而释放空间。
而static局部变量不会,它的值始终存在,static局部变量只被初始化一次,
下次使用的依然是上一次的值。
1,static函数和普通函数有什么区别?
2,static全局变量和普通全局变量有什么区别?
3,static局部变量和普通局部变量有什么区别?
上面这个三个问题也恰好反映了static三个修饰对象,函数,全局变量
和局部变量。
---------------------------------------------------------------------
一,static函数和普通函数有什么区别?(static主要用来限制作用域)
C语言中函数有内部函数和外部函数之分。内部函数只能被在本文件
内调用,也就是函数的作用域被指定了。而外部函数是没有指定作用域的。
如果函数什么都没有加,也就是默认情况下是外部函数。
在内核里面有很多函数只供内部使用,故可以将其声明为内部函数,而供外
部提供接口的函数就不用声明为内部函数。例如:内核红黑树的实现。
左旋,右旋的实现就是供内部使用的。声明为内部函数。
- static void __rb_rotate_left(struct rb_node*node, struct rb_root*root)
- static void __rb_rotate_right(struct rb_node *node, struct rb_root *root)
- void rb_insert_color(struct rb_node*node, struct rb_root*root)
必要的时候声明为内部函数有什么好处呢?
1,可以避免重命名的问题。
内核代码这么多,很容易就遇到了重命名问题,如果声明为内部函数
即使出现重命名,编译器也不会报错。
2,可以提高代码的健壮性。
有些内部函数指定了作用域相对于对外是透明的,外面就调用不了。
所以可以避免代码的错宗复杂引发的错误。
例如:
file1.c:
- #include <stdio.h>
- static void hello1(void);
- static void hello2(void);
- static void hello1(void)
- {
- printf("aaaaaaaaa\n");
- }
- static void hello2(void)
- {
- printf("cccccccc\n");
- }
- int main(void)
- {
- hello1();
- hello2();
- return 0;
- }
- #include <stdio.h>
- static void hello2(void);
- static void hello2(void)
- {
- printf("bbbbbbbbbbb\n");
- }
----------------------------------------------------------------------
二,static全局变量和普通全局变量有什么区别?(static主要用来限制作用域)
假如现在在一个文件里面定义了一个全局变量,要在另外一个文件里面引用。
该如何引用呢?static修饰的全局变量在别的文件是不可见的,而在本文件是可见
的,这和static修饰函数的作用差不多,可以见上面的例题。
全局变量的空间的开辟在静态区,加static修饰后仍然在静态区。唯一有变化的
就是作用域,加static作用域限定在本文件,不加static的全居变量作用域为整个
源程序。
用static修饰的变量位于静态区,那静态区又在哪儿呢?我也没有确定的答案。
个人看法,静态区=数据段+BSS段,静态区主要用来区分栈的。
- #include <stdio.h>
- static int k = 9;//----->数据段(静态区)
- static int h;//--------->BSS(静态区)
- int main(void)
- {
- static int i = 1;//-------->数据段(静态区)
- int j = 2;//-------->栈上。
- printf("addr of main = %p\n",main);
- printf("addr of i = %p\n",&i);
- printf("(begin stack)addr of j = %p\n",&j);
- printf("addr of k = %p\n",&k);
- printf("addr of h = %p\n",&h);
-
- return 0;
- }
------------------------------------------------------------------------
三,static局部变量和普通局部变量有什么区别?(主要用于设置存储属性的)
普通局部变量随函数的调用而开辟空间,随函数执行完而释放空间。
而static局部变量不会,它的值始终存在,static局部变量只被初始化一次,
下次使用的依然是上一次的值。
---------------------------------------------------------------------------------------------
- static关键词
- static 关键词
- static关键词
- static关键词
- 关键词static
- static关键词
- 关键词static
- 细说static关键词
- static 关键词的作用
- static 关键词的使用
- Java static关键词
- 关键词 register、static、const
- java static 关键词介绍
- static 关键词 in c#
- C++关键词—static本质
- c++的static关键词注意事项
- Java的static关键词详解
- C语言中的static关键词
- WindowsForm应用程序调用WebService
- const
- ubuntu下软件包安装
- 如何检查oracle的归档空间是否满了?
- GCC编译选项
- static关键词
- 使用BusyBox制作Linux根文件系统
- Ubuntu编译内核
- ubuntu下简单体验DNS服务器
- 探索ImageView图片填充算法–fitCenter模式的实现
- ubuntu下简单体验telnet服务器
- 硬盘的存储原理和内部架构
- .vimrc 配置文件( 带注释)
- ubuntu下搭建tftp服务器