接上。。。

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

头文件中写些什么

在上篇博客中写到头文件本身不参与编译,但是它们被包含到源文件中,那么头文件里面应该写一下什么呢?

根据“单一定义”原则,我们可以很明显的知道,头文件不应该放对象的定义,只能写对象的声明。如果写有对象的定义,相当于在所有包含该头文件的源文件中都对其进行了定义,这是不合法的。

因此,下面的这些内容应该放在头文件中:函数原型声明、全局变量声明、自己定义的宏和类型等。

下面这些内容不应该放在头文件中:全局变量的定义、外部变量的定义、静态变量和静态函数的的定义、在类体之外的类成员函数的定义等。头文件应该包含和不应该包含什么内容,都是为了满足头文件被多个源文件包含而不引发编译错误。

但是有三个例外是可以写在头文件中的;

头文件中可以写const对象的定义

因为全局的const对象默认只在当前文件中有效,把const对象写进头文件中,即使它被包含到其他多个.cpp文件中,这个对象也都只在包含它的文件中有效,对其他文件来说是不可见的,所以便不会导致多重定义。同理,static对象的定义也可以放进头文件。

头文件中可以写内联函数(inline)的定义

       inline函数是需要编译器在遇到它的地方根据它的定义把它内联展开的,而并非是普通函数那样可以先声明再链接的,内联函数并不会参与链接,所以编译器就需要在编译时看到内联函数的完整定义才行。C++规定,内联函数可以在程序中定义多次,只要内联函数的定义在一个.cpp文件中只出现一次,并且在所有的.cpp文件中,这个内联函数的定义是一样的,就能通过编译。那么把内联函数的定义放进一个头文件中就能满足以上的要求,何乐不为呢。

头文件中可以写类 (class)的定义

在程序中创建一个类的对象时,编译器只有在这个类的定义完全可见的情况下,才能知道这个类的对象应该如何布局,所以,关于类的定义的要求,跟内联函数是基本一样的。所以把类的定义放进头文件,在使用到这个类的.cpp文件中去包含这个头文件,是一个很好的做法。类的定义中包含着数据成员和成员函数。数据成员是要等到具体的对象被创建时才会被定义,被分配空间,但函数成员却是需要在一开始就被定义的。

我们可以直接把函数成员的实现代码也写进类定义中。在C++的中,如果函数成员在类的定义体中被定义,那么编译器会视这个函数为内联的。因此是合法的。注意一下,如果把函数成员的定义写在类定义的头文件中,而没有写进类定义范围内,这是非法的,因为这个函数成员此时就不是内联的了,如果该头文件被两个及以上的.cpp文件同时包含,这个函数成员就被重定义了。

头文件的使用

在《C++中头文件的使用》中已经讲过了关于头文件的使用规则,这里再简单的讲一下。

如果头文件中只有对象的声明,那么他被引用多少次都可以。但是有时候头文件会被隐含的包含多次,而在头文件中你使用了上述三种情况中的任意一种情况。例如

在CB.h中定义了一个

const int F=10;

CA.h中包含了CB.h,在main.cpp中同时包含了CA.h与CB.h。那么相当于CB.h被包含main.cpp了两次,那么在进行预编译时,就定义了两个F,这是不合法的。

或者很多人喜欢在头文件中写这样的语句:

int a;

其实这是定义,因为编译器会默认初始化为0;

这写时候都会出现重复定义的错误。

大家可以使用

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

详细的使用方法可以参考《C++中头文件的使用》。

完。。

相关链接。。《C++中头文件的使用》 、C++中的头文件(.h)—详解(1)

【C++】C++中的头文件(.h)—详解(2)相关推荐

  1. mysql映射mapper_Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看 ...

  2. c++头文件|源文件详解

    一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...

  3. c语言 头文件卫士详解,C/C++中的“头文件卫士”

    在Objective C中可以用#import来防止重复包含,但在C/C++中就不同了,只能用"头文件卫士"了. 下面的程序是有错误的: // global.h 文件 // #if ...

  4. 简介明了——map+multimap头文件函数详解

    简介: 只需要记住这些: 1.map函数是一种映射,key–>value 2.map重载了[]运算符,所以可以直接使用 3.map中key值有序且去重(默认升序)   为了更方便.易懂, 笔者将 ...

  5. linux的根文件系统中的proc文件夹详解

    什么是proc文件系统    |linux /proc目录介绍|proc中文手册 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接 ...

  6. VScode 插件中 package.json 文件字段详解

    一.package.json文件内容 {// 插件的名字,应全部小写,不能有空格: string"name": "my-vscode-plugin",// 版本 ...

  7. abaqus dat文件 matlab_工程师联盟科普系列|ABAQUS中的各种文件类型详解-dat文件如何打开...

    ABAQUS产生几类文件:有些是在运行是产生,运行后自动删除:其它一些用于分析.重启.后处理.结果转换或其它软件的文件则被保留,详细如下: 1. model_database_name.cae 模型信 ...

  8. 【C++】C++中的头文件(.h)—详解(1)

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 之前写过一篇<C++中头文件的使用>,那篇文章主要讲述C++中头文件的使用 ...

  9. c标准库头文件ctype.h详解

    最近实践了一些编程,越来越感觉库函数的重要性.掌握越来越多的函数才会站在巨人的肩膀上思考问题,而不是自己去写代码去实现函数,自己又能写几个函数呢-- ctype.h是C标准函数库中的头文件,定义了一批 ...

最新文章

  1. 高压测试平台:高压包产生高电压基本测试参数
  2. ITK:高斯的一阶导数进行卷积来计算图像的梯度
  3. 产品运营 跨境支付_餐饮网店的运营 跨境支付哪个平台最好
  4. UIImagePickerController按钮的中文问题
  5. Shopify 入门 (英文)
  6. jquery.cookie.js
  7. python200行代码_python代码统计200行
  8. 第E题 转换任意进制 (java方法直接解)==输入一个十进制数N,将它转换成R进制数输出
  9. 2016ICPC沈阳站总结
  10. 计算机内存外存共同点,存储器:内存和外存
  11. union union all
  12. 应急响应常用的工具说明
  13. 盐城工学院c语言实验报告簿,盐城工学院单片机实验指导书.doc
  14. Docker学习总结(45)——Docker在沪江落地的实践
  15. 教你用VC6写热血江湖小外挂
  16. 微信自动跳转默认浏览器 微信扫一扫直接打开外部浏览器
  17. 华为S5700_交换机_基础管理配置
  18. 个人热爱软件编程,我对自己做了一个总结
  19. 最新鸽哒IM即时通讯系统源码+带安装教程
  20. 关于数据恢复,记一次修复SD卡 RAW 之后的修复过程

热门文章

  1. PHP特级课视频教程_第三十四集 Mongodb性能优化_李强强
  2. AWR报告中的DB Time 及 Elapsed
  3. 改动office outlook 2007默认文件夹的存放位置
  4. DevOps实战 —— 如何高效地远程部署?自动化运维利器 Fabric 教程
  5. Oracle 修改字符集 为ZHS16GBK
  6. Redis面试 - 生产环境中的 redis 是怎么部署的?
  7. Docker快速搭建Oracle12c
  8. 解决placeholder样式设置无效问题,更改placeholder默认样式颜色
  9. 【JAVA 第五章 】课后习题 Vector类的 初使用
  10. Windows11 Docker镜像存储路径更改(非C盘路径)