欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c++-文件分离

程序员文章站 2022-03-10 12:40:07
实现文件分离 1.头文件中不要使用using namespace,由于c++编译的特性,由于初学还没深入了解,不做具体编译的解释 2.由于没有了命名空间,所以string定义要写成std::string 3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h main. ......

实现文件分离

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变量,因为函数体的作用域仅在函数内。