C++语言特性演示 - Pragma once 与 ifndef 的区别

在C/C++中,通过 #include 来将多个文件(通常是头文件)合并在一起(当然,对于特定的一个文件来说,#include 表示引入其它文件)。为了避免多次,重复的引入同一个文件,我们常采用的方法是使用 #ifndef。

#ifndef的优缺点

#ifndef 的使用方式一般为:

1
2
3
4
5
6
#ifndef __HEADER_FILE_H__
#define __HEADER_FILE_H__

//... 各种声明、定义语句

#endif

HEADER_FILE_H 通常为每个头文件的文件名。 这种方式有以下优点:

  1. 良好的兼容性。因为这是 C++ 的语法标准,因此不同的编译器都能很好的支持。

但该方式也有一些缺点:

  1. 保护文件不被重复引用的关键是 HEADER_FILE_H, 如果不小心在多个文件中定义了同一个宏,则有可能会出现明明 include 了,但去找不到的情况。

比如,我们定义了两个文件: mode1.h 和 mode2.h, 但在定义红的时候,两个文件都定义为 MODE_1_H, 这时候还有一个名为 product.h 的文件,引用了这两个头文件:

1
2
3
#include "mode1.h"
#include "mode2.h"
//.... 程序其它部分

这个时候 mode2.h 中定义的各种程序要素就永远无法引入到 product.h 文件中。

  1. #ifndef 方法的第二个缺点是编译时间比较长,因为需要读文件中的宏才能判断是否已经引入了。

#pragma once 的优缺点

在一些编译器中,也支持 #pragma once 的宏,该宏有编译器提供保证,判断一个文件不会被引入多次。常见的用法:

1
2
3
#pragma once

// ... 程序其它部分

这种方法的优点是:

  1. 不依赖于程序员自己定义的宏名,更安全,能避免 #ifndef 中出现的”冲突”问题。
  2. 编译速度更快。

当这种方法也有缺点, 突出的缺点就是兼容性不好,不是所有的编译器都能支持。

本文标题:C++语言特性演示 - Pragma once 与 ifndef 的区别

文章作者:Morning Star

发布时间:2020年04月28日 - 09:04

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/cplus/cplus-pragms-vs-ifndef/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。