C++变量/函数 声明与定义 源文件与头文件

C++有分离式编译,可以将一个程序分为多个源文件独立编译,再通过链接合并到一起。.h文件的作用只是在源文件中include,不会单独被编译。

如果在不同源文件间需要共享全局变量,这时就需要extern发挥作用。extern用于声明,声明可以声明多次,定义只能有一次。因为头文件可能会被多个源文件包含,所以全局变量的定义不可放在头文件中,否则会导致全局变量多重定义。

看下面的例子:

//1.cpp
int a = 5;
//2.cpp
int a = 6;

此时编译出错,有多重定义。

//1.cpp
int a = 5;
//2.cpp
cout << a << endl;

此时也出错,因为在2.cpp中没有a的定义。

//1.cpp
int a = 5;
//2.cpp
extern int a;
cout << a << endl;

此时正确了!!

再看

//1.cpp
const int a = 5;
//2.cpp
int a = 6;
// 3.h
int a = 6;

此时也是正确的,这是因为.h没有被包含,并且const有特殊性。非const变量默认为extern const变量默认为文件的局部变量。详情参考文章:C/C++头文件与变量的声明和定义

头文件用于声明而不是用于定义;
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义;
允许const变量定义在头文件中,因为const对象默认定义为它的文件的局部变量,所以包含该头文件的源文件都有自己的const变量;另外,如果const变量不是用常量表达式初始化,那么它不应该在头文件中定义,否则,该变量应该在一个源文件中定义并初始化,然后在头文件中添加extern共享;

至于函数的声明和定义,道理也是如此。声明可以放在头文件中,这样可以同时被多个源文件使用。而定义只需要放在某个源文件中就好(这个源文件应该include声明的头文件)。

你可能感兴趣的:(C/C++)