-
局部变量:
作用域为当前代码块,即{}中。在代码块外部不可见。
-
静态变量:
- 局部静态变量,即在代码块中声明的静态变量,作用域为当前代码块,超过该代码块则不可见:
static int a = 0;
void Test()
{
static int a = 0;
}
2.类静态成员变量,作用域为当前类,超出类范围则不可见
static int a;
class Test
{
static int a;
};
3.全局静态变量,不在类中也不在代码块中。该变量作用范围在当前文件。
a.cpp 中定义static int a = 0; b.cpp中定义static int a=0;
编译链接通过,因为a.cpp和b.cpp都不知道对方有a,故各自使用各自的。
-
全局变量
全局变量作用范围为整个模块\工程,如果其他文件中有定义同名变量,链接器会报符号重定义,如果确实想在整个模块中使用一个变量。则需要在一个cpp中定义,其他引用的地方需要extern修饰声明使用该变量:
a.cpp定义int _a = 0; b.cpp中使用: extern int _a; _a = 1;
任何全局变量,静态\非静态,都不应该被定义在.h文件中,因为.h文件会被其他文件包含,如果是非静态全局变量,在链接时会直接报符号重定义,因为.h被cpp包含一次,就会多一次定义。 如果是静态全局变量,则比较隐晦,连接器不会报错,但是包含该.h的cpp都会有一个该变量的定义,结果是各自使用各自的,除非清楚这样的作用,否则绝不应该使用。建议永远不要再.h中定义全局变量,无论是否静态。
特别:
对于类中声明的静态变量,.h被多次包含后并不会报错,这是因为,类中的静态成员仅仅是声名,真正的定义是在类的cpp中定义的,所以无论包含了多少次.h,变量的定义始终只有一份。
函数符号的可见跟全局变量相同,因此头文件中也不要定义函数,会导致包含这个头文件的其他CPP重定义。如果想在.h中定义函数,可以用inline修饰,内联函数没有这个限制。
说说C++的模块组织,.h用来存放类型声明,包括类,函数,和const变量,.cpp中用来存放类定义,函数定义,和静态\全局变量的定义。