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++有了更深的了解之后,再写一篇完整的博客来解释文件分离的实现,迫于课程设计的安排,不得不囫囵吞枣一下,嘻嘻嘻
还有一点就是在解决这,个问题的时候,又看到有说函数模板解决的,我现在大致明白了函数模板是干什么的,但在实现文件分离这一块还不是很明白,以后再补上,嘿嘿嘿!!~··
接下来介绍一篇我发现的一篇博客,底部有转载处:
- namespace和class
命名空间和类,非常相似,比如:
std::cout 和a::f(), 都用到了作用域符,都可以防止重名函数,可以更好的支持多人编程。
但是有几个不同:
namespace 可以写在多个不同的文件中,而class只能在一个文件中。
如果想使用a类中的函数如a::f(), 需要建立一个类的实例(静态函数等除外),而namespace则相当于本身就是一个建立好的实例,可以直接调用函数。
除此之外,可以将命名空间看做特殊的类。
需要注意的是千万不要在h文件中使用using namespace,否则整个文件都会带上。
- .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变量,因为函数体的作用域仅在函数内。