内部包含卫哨

内部包含卫哨

文章目录

  • 内部包含卫哨
    • 1. #ifndef
    • 2. #pragma once

转载自 https://blog.csdn.net/zuosifengli/article/details/7912335?utm_source=blogxgwz2
转载自 https://wenku.baidu.com/view/8505a357195f312b3169a59e.html

内部包含卫哨(防止重复包含
在头文件里面使用内部包含卫哨,就是使用一种标志宏,可以放心的在同一个编译单元及其包含的头文件中多次包含一个头文件而不会造成重复包含。

避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。

1. #ifndef

这是宏定义的的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等,实际上确切地说应该是预处理功能中(宏定义,文件包含和条件编译)的其一 ----条件编译。

用法如下:

//file:add.h
#ifndef __ADD_H__        //if not define缩写
#define __ADD_H__
...//其他函数和变量声明等等
int add(int a,int b);
...
#endif

#ifndef的方式受C/C++语言标准支持。它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。尤其注意,#ifndef 可以控制片段。

原理说明:

如果这个标记没有设置,表示这个头文件没有被包含过,则应该被设计标记。反之,如果这个标记已经设置,则表示这个头文件已经被包含,所以应该忽略。

如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。建议是宏名的定义和文件名保持一致。

此外编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目头文件繁多时,ifndef 会使得编译时间相对较长,因此一些编译器逐渐开始支持 #pragma once 的方式。

2. #pragma once

#pragma once
... ... // 声明、定义语句

一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。

你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。

  • 其好处是,你不必再担心宏名冲突了,当然也就不会出现宏名冲突引发的奇怪问题。大型项目的编译速度也因此提高了一些。

  • 对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名冲突引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。

另外,这种方式不支持跨平台!

你可能感兴趣的:(C)