- 变量(包括变量,函数)的使用过程需要声明,定义,使用。
- 声明:告诉编译器目标对象存在,但是编译器不用管是否真实存在。
- 定义:为变量开辟空间,则定义过后该变量就存在了全局唯一地址。
- 使用:利用变量进行业务控制。
其中定义只能进行一次,声明可以出现无数次,使用次数也没有限制。
唯独对定义变量操作存在限制,因为定义是开辟内存的过程,如果可以多次定义,那只能说多次定义的不是同一个变量。
extern int a; // 声明过程
int a{0}; // 定义过程
a = 3; // 使用过程
- 头文件中仅对变量进行声明,当一个头文件被其他文件include后被展开,如果头文件中存在定义,那么该头文件被多次包含就会存在多次定义,就重复定义。
- 解决重定义的方法
int add(int a, int b){return a + b;} // 定义
- 解决方法1:模板化
template<typename T>
T add(T a, T b){return a + b;} // 声明
- 解决方法2:声明与定义分离
// .h
extern int a;
//.cpp
int a = 3;
- 头文件重复包含, 但是作用域不能跨文件,限制的是同一个文件中被多次包含。
// a.h
#pragma once
int a = 3;
// a.cpp
#include "a.h"
// b.cpp
#include "a.h"
- a.h文件中对变量a进行了定义,编译的是目标文件,定义的位置也是目标文件中。若头文件没有被include到源文件中,则该变量并没有实现定义过程。
- a.cpp中include头文件,参与了编译,则进行了一次定义。b.cpp中include头文件,再次参与了编译,则对变量a进行了重复定义。
- 源文件被编译成目标文件,是备用进行链接使用的,全局可见的。