zoukankan      html  css  js  c++  java
  • 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变量,因为函数体的作用域仅在函数内。

    感谢这篇博客给的我启发

  • 相关阅读:
    内置函数
    json && pickle 反序列化
    装饰器(语法糖)
    shell环境改变引起的命令提示符改变
    FTP服务安装与端口说明
    tomcat配置
    greenDao 中连接查询
    COM组件DLL引用时出现检索组件错误
    VS 调试断点命中了,程序无法再断点处中断
    单点登录原理与简单实现
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12089039.html
Copyright © 2011-2022 走看看