对声明和定义的理解
可以先看看这篇博客。
一个变量或函数可以被声明无数次,但是却至多只能被定义一次,且在该变量或函数在使用时,必须被定义一次。(若该函数/变量不被使用,则可以只声明不定义)
一、判断一条语句是否为变量的声明:若变量前有extern关键字,则它为声明,若变量前没有extern关键字,则其为定义:
extern int i; //声明i int i; //定义i,但未对i进行初始化 int i = 5; //是一个定义,同时对i进行了初始化。
总之:判断一条语句是否为声明的声明,关键是看该语句中是否包含extern关键字,而非看该语句中是否包含”=”,”=”的作用是对变量进行初始化。
一个例外: extern int i = 5; 该语句是一个定义,这句话的作用是定义一个全局的int类型变量,变量名为i,i的初值为5。
不能在函数体中使用该语句,会报错: error C2205: 'i': cannot initialize extern variables with block scope。只能在函数外部使用,作用与“int i = 5;“相同。所以”extern int i = 5“这条语句的价值不大。
二、判断一条语句是否为函数声明:若函数包含了实现体(即“{}“),则其为函数定义,否则为函数声明。
void fun() //函数定义 { } void fun() //函数声明
声明一个函数或者变量实际上就是对编译器说:这个函数/变量是存在的。只有当使用这个变量/函数时,编译器才会去确认该变量/函数是否真正存在,如果发现该变量/函数实际并不存在,那么就会build失败。
变量/函数是否真正存在取决于是否定义了这个变量/函数。
若存在某头文件a.h,a.h中定义了变量i“int i;“;若同时有b.c和c.c都include a.h,则build该project时会出错,为何:因为实际上b.c和c.c都包含“int i;“这条语句,在分别compile b.c和c.c时,”int i;“这条语句被compile了两次,因此相当于变量i被定义了两次,因此在link时会出错。