为什么C++中声明和定义要分开写

现在开始写项目了,你会发现我们一般都要写一个cpp,对应的还得有一个h文件,那么为什么在C++中我们要这么做?

.h就是声明,.cpp就是实现,而所谓分离式实现就是指“声明”和“定义”分别保存在不同的文件中,声明保存在.h文件、定义保存在.cpp文件中。

那么将声明和定义分离有什么意义吗?

首先从非分离式(声明的同时给出定义)看,其内容一般保存在.h文件中,以供多个源文件引用。

但是将定义放在头文件,那么当多个源文件使用#include命令包含此类的头文件便会在链接阶段出现“multiple definition”链接错误!

那么想让多个文件使用此头文件,又不引发链接的“multiple definition”错误该怎么办呢?

分离式的实现便可以解决这个问题。因为.h文件中只包含声明,即使被多个源文件引用也不会导致“multiple definition”链接错误。

所以分离式实现增强了命名空间的实用性。

时间: 2024-11-03 09:18:52

为什么C++中声明和定义要分开写的相关文章

C++中声明和定义的区别

声明 这有一个与这个名字相关的东西,并且它是这个类型的,告诉编译器我要使用它,并期待它定义在某一个地方. 定义 定义是指提供所有必要的信息(占用内存大小),使其能够创建整个实体. 我们必须明白的: 一旦定义了也就是声明了,所以可以同时声明和定义一个函数. 类或者变量,但是不一定非得这样做. 定义一个函数意味着提供函数体: void func() {}; 定义一个类意味着给出类的方法以及成员: class A {}; 定义一个变量意味着告诉编译器变量的类型以及在程序的哪儿去创建这个变量: int

C++ Prime:变量声明和定义的关系

为了允许把程序拆分为多个逻辑部分来编写,C++语言支持分离式编译机制,允许将程序分割为若干个文件,每个文件可以独立编译. 为了支持分离式编译,C++将声明和定义区分开.声明使得名字为程序所知,一个文件如果想使用别处定义的名字必须包含对那个名字的声明.定义则负责创建与名字关联的实体. 变量声明规定了变量的类型和名字,定义还额外的申请储存空间,也可能会为变量赋一个初值. 想声明一个变量而不是定义它,在变量名之前添加关键字extern,而且不要显示地初始化变量: extern int i; // 声明

C语言,函数的声明与定义

函数声明与定义 变量: 在讲变量前,先讲一下变量的声明和定义这两个概念. 声明一个变量,意味着向编译器描述变量的类型,但不为变量分配存储空间. 定义一个变量,意味着在声明变量的同时还要为变量分配存储空间,在定义变量的同时为变量初始化. 局部变量:通常只定义不声明. 全局变量:通常在源文件中定义,在头文件中声明. 在一个函数内部定义的变量成为局部变量,它在本函数内有效. 函数中的局部变量,如果不定义类型,其缺省是自动变量auto, 例如:int a,b=2; 其等价于auto int a,b =

OC基础--OC中类的声明与定义

OC中设计一个类的步骤: 一.声明类: 1.用到的关键字[email protected] 和 @end 2.类名 3.继承NSObject 4.属性 5.方法(行为,只需要声明) 二.实现(定义)类 1.用到的关键字[email protected] 和 @end 2.实现@interface中声明的方法 3.类中方法的声明和实现一定注意开头写减号“-” 4.OC类中的小括号不能乱用,小括号是用来括住类型的!--谨记! 例: 下面的代码中声明和定义的类,类中的方法没有返回值,没有参数 1 *

模板类和模板函数的声明和定义分开文件写的方法

据说模板类和模板函数的声明和定义要写在同一个文件. 不然编译会出现"未定义的引用". 其实是有解决方法的. 模板类 template class CNNConvLayer<double>; 就是 template class className<typeName>; 模板函数 template void poolBackPropForKernal<double>(double*, double*, int, int, double*, double*

C++中的声明和定义

<C++Primer>第四版 2.3.5节中这么说到: ① 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ② 变量声明:用于向程序表明变量的类型和名字. ③ 定义也是声明:当定义变量时我们声明了它的类型和名字. ④ extern关键字:通过使用extern关键字声明变量名而不定义它. 1.定义也是声明,extern声明不是定义,即不分配存储空间.extern告诉编译器变量在其他地方定义了. 例如:extern int i; //声明,不是定义 int

C++中全局变量的声明和定义

原文链接:http://blog.csdn.net/candyliuxj/article/details/7853938 (1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步:将每个.cpp和相应的.h文件编译成obj文件: 第二步:将工程所有的obj文件进行Link,生成最终的.exe文件. 这样,错误可能在两个地方产生: 一个是在编译的时候发生的错误,主要是语法错误: 一个是在链接的时候的错误,主要是重复定义变量等. 编译单元指在编

C语言中的声明与定义的区别

1.对于下面的声明语句 int a; 如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同时为a分配了存储空间.因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0). 2.又如下面的声明语句: int a = 7; 在定义a的同时也为a明确指定了初始值.这个语句不仅为a分配内存,而且也说明了在该内存中应

【转载】C++中结构体的声明和定义

http://blog.csdn.net/whuslei/article/details/5665289 1  //定义一个结构体,类型为struct Student 2  struct  Student      3  { 4      string name; 5      double eng; 6      double ch; 7  };  8    9  //定义了一个结构体,类型为struct Student:且定义了一个结构体实例,名叫Stu 10  struct  Studen