对声明和定义的理解

  可以先看看这篇博客

  一个变量函数可以被声明无数次,但是却至多只能被定义一次,且在该变量或函数在使用时必须被定义一次。(若该函数/变量不被使用,则可以只声明不定义)

  一、判断一条语句是否为变量的声明:若变量前有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时会出错。

猜你喜欢

转载自www.cnblogs.com/XiaoXiaoShuai-/p/12008629.html