网站首页 > 基础教程 正文
为什么要避免头文件被多次包含
一个大的工程中,有很多.h和.cpp文件,很容易出现某个.cpp文件include了同一个.h文件多次(可以是间接#include而来的)。在编译代码时,如果头文件被多次包含了,则头文件中的变量就会被重复定义,而编译器不允许变量重复定义,因此直接导致代码编译失败。
如何避免头文件被多次包含
方案1:#ifndef宏
#ifndef _SAMPLE_H_
#define _SAMPLE_H_
...
...
#endif
方案2:#pragma once
#pragma once
...
...
两种方案的联系与区别
(1)#ifndef
#ifndef的方式是C/C++语言特性自身支持的。由于编译器每次都需要打开头文件才能判定是否有重复定义,它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。但是,打开文件判断比较耗时,所以在编译大型项目时,ifndef会使得编译时间相对较长,
初此之外,如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。
(2)#pragma once
#pragma once 由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。
其好处是,你不必再担心宏名冲突了,当然也就不会出现宏名冲突引发的奇怪问题。大型项目的编译速度也因此提高了一些。
对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名冲突引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。
另外,这种方式不一定所有编译器都支持,不支持跨平台!
两种方案如何选择
选择哪种方式,应该在了解这两种方式的情况下,视具体情况而定。只要有一个合理的约定来避开缺点,我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了,应当由程序员自己或者小范围内的开发规范来决定。特别提一下,如果大型项目的话选择用#pragma once还是能提高编译速度的。
猜你喜欢
- 2024-12-29 Windows 取证之EVTX日志 windows日志文件可以删除吗
- 2024-12-29 C++命名空间,简单整理 c++命名法
- 2024-12-29 C++编程:文件的编译、链接和运行 c++编译链接执行全过程
- 2024-12-29 【项目实战】C++多文件写法轻松实现练手小游戏:贪吃蛇!
- 2024-12-29 C++ 20 module小试 c++实验六模板
- 2024-12-29 白话C++编程系列之:多个文件篇 c++多文件编译方法
- 2024-12-29 浅谈linux下进程最大数、最大线程数、进程打开的文件数
- 2024-12-29 C++文件类(文件流类)及用法详解 c++文件流头文件
- 2024-12-29 明明安装了游戏运行库,仍提示缺少C++库文件,现在修复大法来了
- 2024-12-29 C++ 使用 ifstream 按行读取文件内容的深度解析
- 05-24php实现三方支付的方法有哪些?
- 05-24CosmicSting 漏洞影响 75% 的 Adobe Commerce 和 Magento 网站
- 05-24Java接口默认方法的奇妙用途
- 05-24抽象类和接口
- 05-24详解Java抽象类和接口
- 05-24拒绝接口裸奔!开放API接口签名验证
- 05-24每天学Java!Java中的接口有什么作用
- 05-24Java:在Java中使用私有接口方法
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)