C/C++避免头文件重复包含的方法
C/C++避免头文件重复包含的方法
在实际的编程过程中,因为会使用多个文件,所以在文件中不可避免的要引入一些头文件,这样就可能会出现一个头文件被 include 多次,在C/C++中有几种不同的方式可以解决这个问题,总体功能相差不大,但依然存在细微差别。
1. #ifndef
格式如下:
#ifndef __COMPLEX__ #define __COMPLEX__
//头文件主体
#endif
或者
#ifndef __COMPLEX_H__ #define __COMPLEX_H__
//头文件主体
#endif
作用:相同的两个文件不会被重复包含。
优点:
- 受C/C++语言标准的支持,不受编译器的限制。
- 不仅仅局限于避免同一个文件被重复包含,也能避免内容完全相同的两个文件(或代码片段)被重复包含。
缺点:
- 如果不同头文件中的宏名恰好相同,可能就会导致你看到头文件明明存在,编译器却说找不到声明的情况。
- 由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,#ifndef会使得编译时间相对较长。
2. #pragma once
格式如下:
#pragma once
//头文件主体
作用:物理上的同一个文件不会被重复包含。
优点:
- 避免#ifndef中因为宏名相同导致的问题。
- 由于编译器不需要打开头文件就能判定是否有重复定义,因此在编译大型项目时,比#ifndef更快。
缺点:
- #pragma once只针对同一文件有效,对相同的两个文件(或代码片段)使用无效。
- #pragma once不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。
3. 混合使用
格式如下:
#pragma once #ifndef __COMPLEX_H__ #define __COMPLEX_H__
//头文件主体
#endif
混合使用需要注意的是:
1.只要使用了#ifndef就会有宏名冲突的危险。
2.混合使用无法避免不支持#pragma once的编译器报错。
所以混合使用并不一定能得到很好的效果,具体怎么使用,需要视情况而定。
声明
本文章属于转载内容
原作者:九霄星河
文章链接:C/C++避免头文件重复包含的方法