C++中的声明与定义边界不是很清晰,那这两者之间到底有什么差别呢?
声明: 就是告诉编译器这个变量或函数在内存的某个位置已经定义(即分配了内存地址),向编译器做个自我介绍。如果要用就可以直接用,不需要说再来分配相应的内存。 变量或函数的声明用关键字extern来表明,但函数声明可以省略。原因在于函数的声明与定义边界非常的清晰,没有函数体的就是声明,有函数体的就是定义。
定义: 就是这个变量或函数在内存的某个位置还不曾存在,需要编译器来分配相应的内存存储。
难点:
但是有时候,一个定义也是一个声明,即int x; 如果编译器在内存中没有找到变量标识 x,则就会在声明的同时定义它。也就是说,如果之前其它文件中不存在变量x,则就定义它。注意此处没有关键字extern在变量x之前。如果有这个关键字,则此变量x必定是声明,而不是定义。
代码示例:
#include <iostream>
using namespace std;
extern int i;//声明一个变量,但不定义(即不分配内存)
extern double f(int);//声明一个函数,但不定义
int b;//声明并定义一个变量,分配内存
int i;//定义一个变量,前面的extern int i是声明,真正的定义在这里
double f(int x){//函数的定义
return x + 0.1;//类型自动提升
}
int h(int x){//函数声明并定义
return x + 2;
}
int main(){
i = 1;
cout<<"Call f() = "<<f(i)<<endl;
b = 2;
cout<<"Call h() = "<<h(b)<<endl;
}执行结果:
Call f() = 1.1
Call h() = 4