c++-文件分离

2019-12-23 16:01:47来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

c++-文件分离

实现文件分离

1.头文件中不要使用using namespace,由于c++编译的特性,由于初学还没深入了解,不做具体编译的解释
2.由于没有了命名空间,所以string定义要写成std::string
3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h

main.cpp

#include <iostream>
#include <string>
#include <fstream>

#include "staff.cpp"

staff.cpp

#include <iostream>
#include <string>
#include <fstream>
#include "staff.h"

using namespace std;

这样就可以通过编译了

那么为什么呢?经过网上查阅资料找到了原因:

但是下面的解释我感觉还是有不对,下面的内容仅供参考,带我对c++有了更深的了解之后,再写一篇完整的博客来解释文件分离的实现,迫于课程设计的安排,不得不囫囵吞枣一下,嘻嘻嘻
还有一点就是在解决这,个问题的时候,又看到有说函数模板解决的,我现在大致明白了函数模板是干什么的,但在实现文件分离这一块还不是很明白,以后再补上,嘿嘿嘿!!~··
接下来介绍一篇我发现的一篇博客,底部有转载处:

  1. namespace和class

命名空间和类,非常相似,比如:

std::cout 和A::f(), 都用到了作用域符,都可以防止重名函数,可以更好的支持多人编程。

但是有几个不同:

  1. namespace 可以写在多个不同的文件中,而class只能在一个文件中。

  2. 如果想使用A类中的函数如A::f(), 需要建立一个类的实例(静态函数等除外),而namespace则相当于本身就是一个建立好的实例,可以直接调用函数。

除此之外,可以将命名空间看做特殊的类。

需要注意的是千万不要在h文件中使用using namespace,否则整个文件都会带上。

  1. .h文件和.cpp文件

首先要知道的是两种文件的最大区别:

编译器将所有.cpp文件编译为.obj文件再串联起来。如果.cpp中有#include X.h文件,那么第一步预处理会把X.h代码粘贴到.cpp中代替#include语句。

基于这个特性,显然,如果我们include 同一工程下的.cpp文件,那么会将该.cpp文件重复两次(一次是本身的编译,一次是include的复制)。因此,.cpp文件不适合进行include。

而我们往往需要在一个.cpp文件中include很多其他文件的代码,那么这时候就需要.h文件。

一个比喻就是.h是目录,.cpp是内容。

这里需要再说一下编译的过程,关键是声明和定义的区分。

如果是声明的话,比如声明了一个函数,在汇编语言中就会通过call语句等在全局中寻找这个函数,只需要这个函数在别的.cpp文件中有定义就可以了,而不需要当时就定义。

对变量也是这样,当想使用一个别处定义的变量时,首先要声明,使得该名字为程序所知。

如果不加“extern”的声明,如

int j;

则会自动将j定义为j=0,自动初始化。那么这时就会出现重复定义等错误问题。

因此,应该使用

extern int j;

这将告知程序 有这样一个j存在,就可以使用了。而j的定义在其他.cpp中,整体编译完后就可以获得j的定义了。

函数则会自动默认为是extern的效果。

因此,在.h中进行声明,在.cpp中进行定义。可以避免重复的编译,也更便于管理。

注意,不能在函数体内初始化一个extern变量,因为函数体的作用域仅在函数内。

感谢这篇博客给的我启发


原文链接:https://www.cnblogs.com/ygjzs/p/12089039.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C++中set的使用

下一篇:TCP三次握手与四次挥手