声明&定义

变量定义的过程包括了声明,如果在多个文件中使用相同的变量,则需将变量及声明分离开来。

1.声明不会分配内存,但是定义会分配相应的内存空间

2.声明可以有很多次,但是定义只能有一次

Static

void getShape() {
    static double width = 5.0;
    static double height = 5.3;
    static double volume;
    volume = width*height;
    cout << "volume= " << volume << endl;
}
void main() {
    
    getShape();
    system("pause");
    return;
}

static修饰的变量只能在getShape函数中访问,一般局部变量都存储在栈区,声明周期持续到语句结束。而使用static关键字进行修饰后,变量被存储到静态数据区,声明周期延长至整个程序结束。

 

静态全局变量不能为其他文件所用,其他文件可以定义相同名字的变量,不会发生冲突。

静态局部变量一般在声明时初始化,如果未被显式初始化,则初始化为0。

void getShape() {
    static double width;
    static double height;
    static double volume;
    volume = width*height;
    cout << "volume= " << volume << endl;
}
void main() {
    
    getShape();
    system("pause");
    return;
}

运行结果:volume= 0

static定义全局变量时,若函数定义在头文件中,则所有头文件共享该静态全局变量

//test1.h
#pragma once
#include<iostream>
#include<string>
using namespace std;
static int H = 5;
namespace space_static {
    void func1() {
        cout << "func1 in test1.h_ H= "<< H << endl;
        cout << "func1 in test1. h_ H.address= " << &H << endl;
    }
}
//test2.h
#pragma once
#include<iostream>
#include"test1.h"
//using namespace std;
namespace space_static {
    void func2() {
        cout << "func2 in test2: H=" << H << endl;
        cout << "func2 in test2. h_ H.address= " << &H << endl;
    }
}

在源文件中使用静态全局变量时,返回的是该变量初始的值,并不会返回别的文件修改后的值

在源文件中共享静态变量时,存储内容相同,但物理地址不同

//test1.h
#pragma once
#include<iostream>
#include<string>
using namespace std;
namespace space_static {
    static int H = 5;
    void func1();
}
//test1.cpp
#include<iostream>
#include"test1.h"
using namespace std;

namespace space_static {
    void func1() {
        cout << "func1 in test1.h_ H= " << H << endl;
        cout << "func1 in test1. h_ H.address= " << &H << endl;
    }
}
//test2.h
#pragma once
#include<iostream>
#include"test1.h"
//using namespace std;
namespace space_static {
    void func2();
}
//test2.cpp
#include<iostream>
#include"test2.h"
using namespace std;
namespace space_static {
    void func2() {
        cout << "func2 in test2: H=" << H << endl;
        cout << "func2 in test2. h_ H.address= " << &H << endl;
    }
}

返回结果:

func1 in test1.h_ H= 5
func1 in test1. h_ H.address= 00205008
func2 in test2: H=5
func2 in test2. h_ H.address= 0020500C

结论

头文件中定义函数并共享静态全局变量时,每个文件不会重新创建,而在源文件中贡献时则会重新创建

因此,一般定义静态全局变量时,一般将其放在头文件中。

extern

当某个文件已经创建了全局变量时,可通过extern关键字告诉别的文件已经创建过该全局变量,有效避免重复创建的问题