跳转到内容

更多 C++ 惯用法/包含守卫宏

来自维基教科书,开放的书籍,构建开放的世界

包含守卫宏

[编辑 | 编辑源代码]

允许多次包含头文件。

也称为

[编辑 | 编辑源代码]

在同一个编译单元中多次包含相同头文件会导致违反 C++ 的基本规则:单定义规则 (ODR)。由于直接和间接包含,头文件可能会被多次包含。

解决方案和示例代码

[编辑 | 编辑源代码]

包含守卫宏惯用法是一个古老的惯用法,也适用于 C 程序。它使用简单的 #define 来允许在编译单元中多次包含头文件。该惯用法确保在预处理后,头文件中的受保护内容只被编译器看到一次。更准确地说,编译器在头文件第一次被包含的地方看到受保护的内容。以下宏被放置在头文件的开头和结尾

#ifndef MYHEADER_H_ // beginning
#define MYHEADER_H_ 
...
#endif // MYHEADER_H_ // end

注意
程序员通常让他们的包含守卫宏以一个或多个下划线开头,后面跟着大写字母,即使根据 C++ 标准 (ISO/IEC 14882:2003),此类标识符正式保留给编译器和标准库的实现。

一些编译器支持

#pragma once

作为包含守卫的有效替代方案。它不需要像一些编译器中的传统包含守卫宏那样多次打开头文件。在许多现代编译器(如 GCC4 或 MSC++2008)上,#pragma once 不会带来更好的编译时间性能,因为它们会识别头文件守卫。

已知用途

[编辑 | 编辑源代码]

实际上世界上所有的头文件!

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]

#pragma once 在维基百科。

华夏公益教科书