C++编程时如果多个类引用同一个头文件,有可能会产生二次编译的错误,比如公共头文件common.h被CFile1.h和CFile2.h引用,在主函数CFile类中同时引用CFile1.h和CFile2.h时,编译器会报如下错误:text\common.h(3): error C2011: “common”:“class”类型重定义

为了解决以上问题,C++有两种防止头文件被二次编译的方式。

第一种方法采用#pragma once,属于编译器预编译命令。

该方法的优点:避免名字冲突

该方法的缺点:与编译器相关,较早的编译器不支持该方法,且该方法不适用跨平台程序。

并且如果某个头文件有多份拷贝,该方法不能保证不被重复包含。

另一种是采用宏定义

#ifndef XXXX

#define XXXX

//program codes

#endif XXXX

该方法的优点:语言支持,移植性好可用于跨平台的程序

该方法的缺点:宏名字不能冲突,比如:

CFile1头文件中

#ifndef __FILE_H__

#define __FILE_H__

//program codes

#endif

CFile2头文件中也定义了一样的宏。

当在主函数CFile中引用以上两个文件

#include "File1.h"

#include "File2.h"

.................

预编译阶段把File1文件展开,获得宏__FILE_H__,当处理File2文件中发现宏__FILE_H__已经存在,则不会在包含File2文件。

并且由于编译器每次都必须打开头文件才能判断是否有重复定义,在大型项目中,宏定义的方法会使得编译时间相对较长。

C++如何防止头文件被二次编译相关推荐

  1. html预编译语句,头文件为啥加预编译语句

    头文件为什么加预编译语句? typedef int ElementType; /* START: fig3_6.txt */ #ifndef _List_H #define _List_H struc ...

  2. linux编译寻找包含的头文件,Linux编写内核模块编译时找不到头文件

    //所有模块都需要的头文件#include // init&exit 相关宏MODULE_LICENSE("GPL");static int __init hello_in ...

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

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

  4. conan入门(二十):封装只包含头文件(header_only)的库示例

    conan: 封装只包含头文件(header_only)的库示例 有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢? Conan官方文档 <Package sc ...

  5. C++之头文件与源文件

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

  6. 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )

    文章目录 一.交叉编译 Shell 脚本参考 二.NDK r16b 版本配置 三.libjpeg-turbo 交叉编译 Shell 脚本 四.执行 libjpeg-turbo 交叉编译 Shell 脚 ...

  7. C++预处理和头文件保护符

    一预处理 1.常见的预处理功能 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译.布局控制和宏替换4种. 文件包含:#include 是一种最为 ...

  8. c++的头文件与源文件

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

  9. 如何防止头文件被重复包含或引用?

    一.#pragma once ( 比较常用) 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用. #pragmaonce ...

最新文章

  1. matlab龙格库塔法求通解,基于matlab及龙格库塔法求解布拉修斯方程.doc
  2. Intel RealsenseD435 color图与depth图的两种对齐(align)方式
  3. andriod开发环境配置
  4. 详解 | Spring Boot 最核心的 3 个注解详解
  5. 三星U-Boot-1.1.6源码分析lowlevel_init.S (board\samsung\smdk6410)
  6. html app效果图,app端效果图.html
  7. 电导池行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. python--xlrd: xlrd.open_workbook excel.xls CompDocError解决办法
  9. 自反馈与 Mandelbrot set
  10. 服务器硬盘数据备份到nas,群晖NAS教程第五节:如何备份 Synology NAS
  11. 网关报错:Load balancer does not have available server for client: xxx
  12. matlab求一维热传导方程数值解代码,一维热传导方程数值解法及matlab实现
  13. js 计算两个时间的时间差
  14. java clh_CLH lock 原理及JAVA实现
  15. 云计算与大数据技术应用 第三章
  16. 快速填充表格中的空单元格
  17. Android---Toolbar
  18. 散转程序c语言,单片机 散转程序设计 软件实验
  19. 点云配准——(1)几种点云配准算法比较
  20. OCR识别算法深入分析手机端车牌识别

热门文章

  1. opencv 图像颜色空间转换和特定颜色物体追踪
  2. zookeeper教程,docker 安装,命令,python操作zookeeper,分布式队列,分布式锁
  3. PatchGAN:Image-to-Image Translation with Conditional Adversarial Networks
  4. 简单分析Pmod AD5的文档和官方例程
  5. 纯CSS3动画按钮效果
  6. Vue数据绑定和响应式原理
  7. $.getJSON无法对外部变量进行赋值的问题
  8. php上传图片文件常用的几个方法
  9. 实验8:Problem A: 立体空间中的点(I)
  10. 发布后500访问错误 —— dll引用错误