实现文件分离

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

感谢这篇博客给的我启发

c++-文件分离的更多相关文章

  1. nginx+tomcat+二级域名静态文件分离支持mp4视频播放配置实例

    nginx+tomcat+二级域名静态文件分离支持mp4视频播放配置实例 二级域名配置 在/etc/nginx/conf.d/目录下配置二级域名同名的conf文件,路径改成对应的即可 statics. ...

  2. C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

    C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...

  3. 实现C++模板类头文件和实现文件分离的方法

    如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关. 引用<<C++primer(第四版)>>里的观点:1)标准C++为编译模板代码定义了两种模型:“包含”模型和“ ...

  4. angular ,require.js, angular-async-loader实现单页面路由,控制器js文件分离

    https://github.com/heboliufengjie/appRoute/tree/re re 分支,实现,路由配置,控制器js文件分离

  5. C++模板类头文件和实现文件分离

    http://www.cnblogs.com/lvdongjie/p/4288373.html 如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关. 引用<<C++primer ...

  6. 前端响应式のmedia文件分离

    响应式cssのmedia文件分离 media简介 1.媒体查询,添加自CSS3 2.一个媒体查询由一个可选的媒体类型和零个或多个使用媒体功能的限制了样式表范围的表达式组成,允许内容的呈现针对一个特定范 ...

  7. Android开发 多媒体提取器MediaExtractor详解_将一个视频文件分离视频与音频

    前言 此篇博客讲解MediaExtractor将一个视频文件分离视频与音频,如果你对MediaExtractor还没有一个笼统的概念建议先了解我的另一篇入门博客:https://www.cnblogs ...

  8. 基于webpack实现多html页面开发框架二 css打包、支持scss、文件分离

    本节主要介绍webpack打包的时候CSS的处理方式 一.解决什么问题      1.CSS打包      2.CSS处理浏览器兼容      3.SASS支持      4.CSS分离成单独的文件 ...

  9. spring/boot 打包,资源/配置/业务文件分离

    spring/boot打包,将业务jar包和资源配置文件进行分离打包,打包后的资源在target/release文件夹下面 注意:添加以下配置后,注意修改自己的入口类 <!--相关编译打包依赖- ...

随机推荐

  1. forms 组件的功能和使用

    forms组件 先自己实现注册功能,并且对用户输入的信息加限制条件 如果用户输入的信息不符合条件,前端展示报错信息 注册示例: 1.前端渲染标签获取用户输入 >>> 前端渲染标签 2 ...

  2. Http头域字段详解

    HTTP(HyperTextTransferProtocol) 是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客 ...

  3. 拾遗:Go 基础

    这 Go,越看越像是 C 和 Python 的混合体--! gofmt 用于格式化代码,缩进使用 tab,而不是空格:Python 官方则建议使用空格,而不是 tab package Go 惯例,使用 ...

  4. centos7部署汉化版gitlab

    =============================================== 2018/6/5_第7次修改                       ccb_warlock 更新说 ...

  5. kafka相关业务必会操作命令整理

    参考:https://kafka.apache.org 服务相关命令 1.启动/停止zk > bin/zookeeper-server-start.sh config/zookeeper.pro ...

  6. 使用Swagger2Markup归档swagger生成的API文档

    文章出处: http://blog.didispace.com/swagger2markup-asciidoc/ 说明 项目中使用Swagger之后,我们能够很轻松的管理API文档,并非常简单的模拟接 ...

  7. springboot配置swagger-rest文档

    前言 swagger是一个很好的restful形式的api文档,可以通过比较小的侵入来提供很好的restful的文档.因为swagger是依赖服务生成的,所以其实是依赖服务的,这也算是它的一个小缺点吧 ...

  8. JS设置浏览器缓存,以及常用函数整理

    //设置缓存 function set_cache(key,value){ if(key=='') return false; localStorage.setItem(key, value); } ...

  9. win查看所有wifi密码

    for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | finds ...

  10. 浅谈fetch

    在开发过程中,我们向服务端发送请求,一般会使用三种方式, XMLHttpRequest(XHR),jQuery实现的AJAX,Fetch ,让我们首先来比较一下这三者的使用示例. XMLHttpReq ...