- 变量的声明:告诉这个变量的类型和名字,可以多次声明,但只能定义一次
- 变量的定义:变量的定义会分配内存存储空间,可以为变量指定初始值。注意,同一程序中变量只能定义一次。
- 两者之间有何区别:
定义一个变量,实际上也是声明了它的数据类型和名字,因此定义包含了声明。但是声明就不是定义了,前面说过,声明仅仅告诉我们变量的数据类型和名字,并未分配存储空间,因此还不能使用。
举个例子:
// Demo1.hpp 头文件
#ifndef Demo1_hpp
#define Demo1_hpp
#include <stdio.h>
// 变量声明,告诉变量的类型,但未实现
extern int i;
// 函数声明, 未实现
int sum(int a, int b);
#endif /* Demo1_hpp */
如果将这个头文件给你,不给你实现。你能正常调用变量 i 和函数 sum 吗? 显然是不行的。如果给出了实现文件如下
#include "Demo1.hpp"
int sum(int a, int b)
{
return a + b + i;
}
这样是不是就实现了 sum, 外部可以正常调用啦! 话说回来变量 i 只是声明了而已,并非定义了,程序开辟内存空间中不存在这个变量的地址和值。这个时候你调用它,肯定会导致变量未定义错误的。这个时候我们就要给变量 i 开辟内存空间。
#include "Demo1.hpp"
// 变量被定义,开辟内存空间并且设置了初始值
int i = 100;
int sum(int a, int b)
{
return a + b + i;
}
来看 main 函数,
#include <iostream>
#include "Demo1.hpp"
// 声明一个变量,它的定义在其他文件。
extern int i;
int main(int argc, const char * argv[]) {
using std::cout;
using std::endl;
cout << "add 3 2: " << sum(3, 2) << endl;
cout << "i: " << ++i << endl;
return 0;
}
那到底解决什么问题呢?
在某些情况下,需要共享全局变量,这个变量在别的文件中被定义。