防止C语言头文件被重复包含

编程入门 行业动态 更新时间:2024-10-05 03:18:37

防止C语言<a href=https://www.elefans.com/category/jswz/34/1767301.html style=头文件被重复包含"/>

防止C语言头文件被重复包含

文章目录

    • 方法一:使用宏保护防止C语言头文件被重复包含 (很常用)
    • 方法二: #pragma once(在头文件的最开始加入) ( 比较常用)

参考链接:

方法一:使用宏保护防止C语言头文件被重复包含 (很常用)

当1个C语言程序由 多个 源程序文件 组成时,由于每个 源程序文件 都有 #include <…>
#include “…h”, 最终它们可能形成交叉 包含 和 重复包含 现象 而造成错误。
为了避免这种情况发生,可以 采用 定义宏 的方法 把各内个头文件 包起来。
编译器 在正式编译的开始,现处理 宏 – 也就是“预编译命令".

用 宏(#号开始的行) 把 头文件内容容 包起来:

#ifndef HEADER_One_H // 意思是:宏开始行,如果还没有定义 HEADER_One_H 则 进入,否则退出
#define HEADER_One_H //定义 HEADER_One_H//
header1.h
头文件内容
#endif // 宏结束行

博客2:

多重包含在绝大多数情况下出现在大型程序中,它往往需要使用很多头文件,因此要发现重复包含并不容易。要解决这个问题,我们可以使用条件编译。如果所有的头文件都像下面这样编写:
#ifndef _HEADERNAME_H
#define _HEADERNAME_H

…//(头文件内容)

#endif

那么多重包含的危险就被消除了。当头文件第一次被包含时,它被正常处理,符号HEADERNAME_H被定义为1。如果头文件被再次包含,通过条件编译,它的内容被忽略。符号HEADERNAME_H按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。

但是,你必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将托慢编译速度,所以如果可能,应该避免出现多重包含。

方法二: #pragma once(在头文件的最开始加入) ( 比较常用)

#pragma once

// contents of the header

#pragma once一般由编译器提供保证:同一个文件不会被包含多次。这里所说的”同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。无法对一个头文件中的一段代码作#pragma once声明,而只能针对文件。此方式不会出现宏名碰撞引发的奇怪问题,大型项目的编译速度也因此提供了一些。缺点是如果某个头文件有多份拷贝,此方法不能保证它们不被重复包含。在C/C++中,#pragma once是一个非标准但是被广泛支持的方式。

#pragma once方式产生于#ifndef之后。#ifndef方式受C/C++语言标准的支持,不受编译器的任何限制;而#pragma once方式有些编译器不支持(较老编译器不支持,如GCC 3.4版本之前不支持#pragmaonce),兼容性不够好。#ifndef可以针对一个文件中的部分代码,而#pragma once只能针对整个文件。

博客链接:
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用。

#pragmaonce是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。

#pragmaonce这种方式,是微软编译器独有的,也是后来才有的,所以知道的人并不是很多,用的人也不是很多,因为他不支持跨平台。如果你想写跨平台的代码,最好使用上一种。这是一种由编译器提供支持的方式,防止同一文件的二次编译,这里的同一文件指的是物理文件。

他也是有弊端的:

假如你的某一个头文件有多份拷贝,那么这些文件虽然在逻辑上都是一样的,但是在物理上他们却是不同的,所以当你把这些文件包含的时候,就会发现真的都包含进来了,然后就是编译错误了。还有,当物理上的同一文件被嵌套包含的时候,使用第一种方法预处理会每一次打开该文件做判断的,但是第二种方法则不会,所以在此#pragma once会更快些。下面举例说明

// Test1.h
#ifndefine TEST1_H
#defineTEST1_H

#endif

// Test2.h
#pragma once        
...// Test.cpp
#include "Test1.h"     // line 1
#include "Test1.h"     // line 2
#include "Test2.h"     // line 3
#include "Test2.h"     // line 4 这里的Test2.h是同一物理文件

预处理器在执行这四句的时候,先打开Test1.h然后发现里面的宏TEST1_H没有被定义,所以会包含这个文件,第二句的时候,同样还是会打开Test2.h的发现宏已定义,就不包含该文件按了。第三句时,发现之前没有包含Test2,h则会把该文件包含进来,执行第四句的时候,发现该文件已经被包含了,所以不用打开就直接跳过了

更多推荐

防止C语言头文件被重复包含

本文发布于:2024-02-28 04:57:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768170.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:头文件   语言

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!