【fishing-pan:https://blog.csdn.net/u013921430转载请注明出处】

1. 头文件的作用

在C++中主要有两类文件.cpp文件和.h(还有.hpp文件);在进行编译的过程中,C++的编译器只会对cpp文件进行编译,.h文件不会参与编译,而是被包含到引用了头文件的cpp文件中。例如,#include "A.h",这样有一个好处,就是在一处进行了声明的变量或者函数能够被多个文件引用,不需要声明多次。

虽然不参与编译,但是其实在头文件们被包含后,某种意义上来说,他们被编译了许多次;

根据“一个变量只能被定义一次”的原则,我们在使用头文件的时候需要一个注意事项;


2. 头文件使用的注意事项

1.  不要随意在头文件定义变量和函数;

一般在头文件中,只声明函数和变量,而不进行定义,例如

声明: extern  int a;和void f();

      定义:如果写上int a;或者void f() {}

        如果进行了定义,一旦这个头文件被两个及以上的cpp文件引用,就会发生编译错误; 但是也有例外的情况,常量对象(const对象)在声明的时候就需要进行赋值(即进行定义)。因为全局的const对象默认只在当前文件中有效。把这样的对象写进头文件中,即使它被包含到其他多个.cpp文件中,这个对象也都只在包含它的文件中有效,对其他文件来说是不可见的,所以便不会导致多重定义。

此外,头文件中可以定义内联函数(inline)和类(class)的定义,包括类的成员函数的定义(注:需要放在类内部);

但是很多时候,我们会不自觉的在头文件中定义变量,或者说我就想在头文件里面定义(虽然非常不建议这样做),怎么办呢?

使用 #ifndef,#define, #endif或者使用#pragma once;

例如下面这段代码;

#ifndef CB_H    //#pragma one
#define CB_H#include"CA.h"class B
{A *ss;
};#endif

       很简单的几行,就能够告诉编译器,这个头文件只编译一次,所以不会多次定义;

在大家使用Visual Studio的时候,若是使用控制台程序,生成的头文件中会自动含有  #ifndef,#define, #endif。

       大家自己写头文件的时候应该养成加入这三句话的习惯,可以免去很多不必要的麻烦;

2. 头文件中类的相互引用;

类在C++中经常被使用,类的所带来的继承和多态让它很强大,可以实现很多功能。大家都知道,父类和子类之间不能相互继承;但是在有些时候,两个类之间需要互相引用或者说父子之间不得不相互包含对方类型的变量,问题就来了,那怎么办呢?

我们看下面这段代码;

#ifndef CB_H
#define CB_H#include"CA.h"//class A;class B
{A *ss;
};#endif
#ifndef CA_H
#define CA_H#include"CB.h"class B;class A
{B *ss;//B s;
};#endif

在代码中类A中有类B的变量,类B中也有A的变量,
       因为我们在CA.H的定义中除了#include "CB.h"还加入了class B,这样一行,这段代码并不会报错,大家可以试试注释掉这样的一行,看看是否会报错。

这样一个前向申明就避免了编译错误,否则B是无法被识别的数据类型;

那么又有一个问题了,为什么实在CA.H中加入class B,而不是在CB.H中加入class A呢?

其实都是一样的,这取决于在各个CPP文件中你先引用(#include)哪个头文件;

例如我是先引用的CB_H;根据引用关系先编译“CB.h”,而在“CB.h”中又引用了“CA.h”。这时候又编译“CA.h”,然后A中又有了B类的数据类型,这个是未知的,所以先声明一个 class B;这样的一个声明就告诉编译器,class B 在别处定义。

#include "CB.h"
#include "CA.h"
#include <iostream>using namespace std;void main()
{system("pause");return;
}

所以就在CA.h中加入class B,若两者交换了位置,相应的就需要在CB.h中加入class A。或者可以将class A也在“CB.h”中加上,这样的话,不用担心头文件的#include顺序问题。


已完。。。

相关博客:C++中的头文件(.h)—详解(1)、C++中的头文件(.h)—详解(2)

【C++】C++中头文件的使用相关推荐

  1. C++中头文件的命名规则

    C++中头文件的命名规则,因为C++是从C语言发展而来的,为了与C兼容,C++保留了C语言中的一些规定,其中就包括用.h作为后缀的头文件,比如大家所熟悉的:stdio.h.math.h和string. ...

  2. ios中头文件交叉导入问题

    ios中头文件交叉导入问题 比如类man中#import "woman.h" 类woman中#import "man.h" 解决方法: 把类woman中#imp ...

  3. Keil C51中头文件INTRINS.H的作用

    KEIL 中 头文件 INTRINS.H的作用 在 C51 单片机编程中,头文件 INTRINS.H 的函数使用起来, 就会让你像在用汇编时一样简便. 内部函数 描述 _crol_ 字符循环左移 _c ...

  4. C++中头文件(.h)和源文件(.cpp)都应该写些什么,头文件中的预编译语句作用,命名空间和头文件的区别与联系,内部链接和外部链接

    1. C++中头文件(.h)和源文件(.cpp)都应该写些什么: 总结下来就是头文件写的就是类的声明(包括类里面的成员和方法的声明)和函数的声明,但一般来说不写出具体的实现.对应的同名(可以不同名,但 ...

  5. C++ 中头文件(.h)和源文件(.cc)的写法简述

    C++ 中头文件(.h)和源文件(.cc)的写法简述 用C++编写比较大型的项目时,文件的分割管理确实确实是非常必要的 .下面就非常简洁明了地谈谈头文件(.h)和源文件(.cc)应该怎么写. 头文件( ...

  6. C语言中头文件和源文件的注意事项

    C语言中头文件和源文件的注意事项 文章目录 C语言中头文件和源文件的注意事项 0.前言 1.实现步骤 1.1 拆分前 1.2 拆分后 2.总结 2.1头文件内容 2.2 源文件(.c)内容 2.3 函 ...

  7. C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)

    c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码.有利于整理思路.使代码脉络更加 ...

  8. C语言中头文件包含的处理原则

    很多事不深入以为自己懂了,但真正用到项目上,才发现了问题.曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的.(毕竟刚毕业时老大对我最初的训练就是 ...

  9. C++11中头文件type_traits介绍

    C++11中的头文件type_traits定义了一系列模板类,在编译期获得某一参数.某一变量.某一个类等等类型信息,主要做静态检查. 此头文件包含三部分: (1).Helper类:帮助创建编译时常量的 ...

  10. C++11中头文件atomic的使用

    原子库为细粒度的原子操作提供组件,允许无锁并发编程.涉及同一对象的每个原子操作,相对于任何其他原子操作是不可分的.原子对象不具有数据竞争(data race).原子类型对象的主要特点就是从不同线程访问 ...

最新文章

  1. keras 的 example 文件 lstm_stateful.py 解析
  2. 基于单片机的简单的任务调度器
  3. 【强化学习】策略梯度Policy-Gradient
  4. java校园足球管理系统_基于jsp的校园足球管理平台-JavaEE实现校园足球管理平台 - java项目源码...
  5. 12月9日 php环境的安装和基本知识的学习
  6. ubuntu 局域网dns服务器_如何在 Ubuntu 16.04 服务器上配置内网 DNS 服务
  7. springboot集成spring security实现登录和注销
  8. Symbian和C++ SDK开发入门之部署
  9. 网络基础---IP编址
  10. 面试官系统精讲Java源码及大厂真题 - 43 ThreadLocal 源码解析
  11. 云原生的本质_你懂什么是云原生吗?
  12. 算法 matlab_MATLAB遗传算法及其实现
  13. ACM弱校ACMer A HDU1045Fire Net有感
  14. 第二周java基础学习内容
  15. 使用D3绘制图表(6)--竖直柱状图表
  16. Mac OS git多次需要输入用户名密码config解决
  17. 成品app直播源码,实现图形验证码
  18. Python基础知识从hello world 开始(第一天)
  19. Android X86上运行基于ARMARM处理器的应用程序
  20. 儿童吹泡泡水简单配方_小孩吹泡泡的 泡泡水,有谁知道详细的配方?

热门文章

  1. 容器编排技术 -- Kubernetes 为 Namespace 配置默认的内存请求与限额
  2. HashMap的扩容机制
  3. 【TencentOS tiny】深度源码分析(4)——消息队列
  4. 【Day08】请简述虚拟 DOM 中 Key 的作用和好处
  5. 从头到尾打印链表c++_从头到尾创建一个C#应用程序-完整的24小时课程
  6. heroku服务器_如何在Heroku上使用Express服务器部署React应用
  7. 很想去的地方面试没过_我们研究了学生在技术面试中的表现。 他们上学的地方没关系。...
  8. ctk 组件创建 ui_创建可重复使用的UI组件的提示和技巧
  9. 135_Power Query M语言快捷输入之输入法设置自定义短语
  10. 图解高性能服务器开发两种模式,第四章 NETTY高性能架构设计