STATIC
一,static全局变量
它只在定义它的源文件内有效,其他源文件无法访问它。
二,static局部变量
static局部变量中文名叫静态局部变量。与普通的局部变量区别:
1)位置:静态局部变量被编译器放在全局存储区.data
2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
三,static函数
C++面向对象编程中的private函数,私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是static函数,完成面向对象编程中private函数的功能。所以static函数的作用域是本源文件。即static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
说明符
Auto
只在块内变量声明中被允许, 表示变量具有本地生存期.
Extern
出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存期, 连接程序知道其名字.
Static
可以放在函数与变量声明中,在函数定义时,只用于指定函数名,而不将函数导出到链接程序,在函数声明中,表示其后边会有定义声明的函数,存储类型static.在数据声明中,总是表示定义的声明不导出到连接程序.
变量定义
1) 所有全局变量全部以g_开头,并且尽可能声明成static类型.
2) 尽量杜绝跨文件访问全局变量.如果的确需要在多个文件内访问同一变量,应该由该变量定义所在文件内提供GET/PUT函数实现.
3) 全局变量必须要有一个初始值,全局变量尽量放在一个专门的函数内初始化.
4) 如调用的函数少于三个,请考虑改为局部变量实现.
头文件
大致格式:
#ifndef __ABC_H__
#define __ABC_H__
//以上是为了防止头文件被多次包含,可以省略,最好有,名字任意,保证唯一即可
//以下是宏定义,可有可无
#define MAX 100
#define MIN 0
//以下是结构声明,可有可无
typedef struct{
int a;
}ABC;
//以下是函数声明,可有可无
void abcfun(int a,int b);
...
#endif
类型提升
a、 在任何涉及两种数据类型的操作中,它们之间等级较低的类型会被转换成等级较高的类型。
b、在赋值语句中,= 右边的值在赋予 = 左边的变量之前,首先要将右边的值的数据类型转换成左边变量的类型。也就是说,左边变量是什么数据类型,右边的值就要转换成什么数据类型的值。这个过程可 能导致右边的值的类型升级,也可能导致其类型降级(demotion)。所谓“降级”,是指等级较高的类型被转换成等级较低的类型。
c、作为参数传递给函数时,char 和 short 会被转换成 int,float 会被转换成 double。使用函数原型可以避免这种自动升级。
一,static全局变量
它只在定义它的源文件内有效,其他源文件无法访问它。
二,static局部变量
static局部变量中文名叫静态局部变量。与普通的局部变量区别:
1)位置:静态局部变量被编译器放在全局存储区.data
2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
三,static函数
C++面向对象编程中的private函数,私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是static函数,完成面向对象编程中private函数的功能。所以static函数的作用域是本源文件。即static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
说明符
Auto
只在块内变量声明中被允许, 表示变量具有本地生存期.
Extern
出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存期, 连接程序知道其名字.
Static
可以放在函数与变量声明中,在函数定义时,只用于指定函数名,而不将函数导出到链接程序,在函数声明中,表示其后边会有定义声明的函数,存储类型static.在数据声明中,总是表示定义的声明不导出到连接程序.
变量定义
1) 所有全局变量全部以g_开头,并且尽可能声明成static类型.
2) 尽量杜绝跨文件访问全局变量.如果的确需要在多个文件内访问同一变量,应该由该变量定义所在文件内提供GET/PUT函数实现.
3) 全局变量必须要有一个初始值,全局变量尽量放在一个专门的函数内初始化.
4) 如调用的函数少于三个,请考虑改为局部变量实现.
头文件
大致格式:
#ifndef __ABC_H__
#define __ABC_H__
//以上是为了防止头文件被多次包含,可以省略,最好有,名字任意,保证唯一即可
//以下是宏定义,可有可无
#define MAX 100
#define MIN 0
//以下是结构声明,可有可无
typedef struct{
int a;
}ABC;
//以下是函数声明,可有可无
void abcfun(int a,int b);
...
#endif
类型提升
a、 在任何涉及两种数据类型的操作中,它们之间等级较低的类型会被转换成等级较高的类型。
b、在赋值语句中,= 右边的值在赋予 = 左边的变量之前,首先要将右边的值的数据类型转换成左边变量的类型。也就是说,左边变量是什么数据类型,右边的值就要转换成什么数据类型的值。这个过程可 能导致右边的值的类型升级,也可能导致其类型降级(demotion)。所谓“降级”,是指等级较高的类型被转换成等级较低的类型。
c、作为参数传递给函数时,char 和 short 会被转换成 int,float 会被转换成 double。使用函数原型可以避免这种自动升级。