实现文件分离

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. Vue学习笔记【6】——事件修饰符

    .stop 阻止冒泡(阻止事件向外层冒泡) .prevent 阻止默认事件(链接跳转.表单提交) .capture 添加事件侦听器时使用事件捕获模式(从外到里触发事件) .self 只当事件在该元素本 ...

  2. Vue学习笔记【5】——如何定义一个基本的Vue代码结构

    插值表达式{{}} 和 v-text 默认 v-text 是没有闪烁问题的: v-text会覆盖元素中原本的内容,但是 插值表达式只会替换自己的这个占位符,不会把 整个元素的内容清空 v-cloak ...

  3. 获取min-max之间的随机数

    private static String getRandom(int min, int max){ Integer random =(int)(min+Math.random()*(max-min+ ...

  4. 单调栈+线段树——cf1220F

     首先考虑初始排列,pi会让周围所有比其大的元素深度+1,所以要求每个点的深度,只要其被覆盖了几次即可 这个覆盖可以通过处理每个元素的左右边界(单调栈O(n))+线段树区间更新(Ologn(n))来做 ...

  5. Linux串口驱动程序(3)-打开设备

    先来分析一下串口打开的过程: 1.用户调用open函数打开串口设备文件:2.在内核中通过tty子系统,把open操作层层传递到串口驱动程序中:3.在串口驱动程序中的xx_open最终实现这个操作.这里 ...

  6. yum 快速LAMP/LNMP 安装(centos7+mysql5.7+apache+php5.6 (缺点:好多模块没有加载)

    1.安装Apache 安装centos7默认自带(Apache2.4.6)版本 yum -y install httpd 2.开启apache服务 systemctl start httpd.serv ...

  7. Linux用户空间内存区域的匿名映射

    1 在调用mmap系统调用时,可以指定的标志(flag)参数: 1: #define MAP_SHARED 0x01 /* Share changes */ 2: #define MAP_PRIVAT ...

  8. Spark:三种任务提交流程standalone、yarn-cluster、yarn-client

    spark的runtime参考:Spark:Yarn-cluster和Yarn-client区别与联系浪尖分享资料 standalone Spark可以通过部署与Yarn的架构类似的框架来提供自己的集 ...

  9. (转载)js调用打印机 打印整体或部分

    本文转载自:https://www.cnblogs.com/lfhy/p/6802781.html 以下为原文内容: 有时前端的项目中需要添加打印的功能,首先要知道打印分为整体打印和局部打印两种,而局 ...

  10. myEclipse环境下配置springMvc项目,进行简单的请求

    1."File-->New-->WebProject"新建一个web项目,命名为springMvc 2.将所需要用到的jar包复制到WEB-INF/lib路径下,然后右 ...