C++(头文件中的 #ifndef、#define、#endif 和 #pragma once 区别和联系)

发布时间 2023-12-12 17:03:54作者: 做梦当财神

#ifndef, #define, #endif#pragma once 都是 C++ 中用于预处理的指令,它们的作用是为了防止头文件被多次包含,避免重复定义和编译错误。

#ifndef, #define, #endif

这是传统的头文件防卫式声明的方式,用于防止头文件被重复包含。

  • #ifndef:如果未定义某个标识符(通常是头文件的宏名),则执行后续操作。
  • #define:定义该标识符,防止后续代码重复执行。
  • #endif:结束防卫式声明。

示例:

#ifndef MY_HEADER_H
#define MY_HEADER_H

// 头文件内容

#endif

如果 MY_HEADER_H 未定义,那么 #ifndef#define 之间的代码将会被预处理器包含在编译中。一旦 MY_HEADER_H 被定义,后续的 #ifndef#define 之间的代码将会被跳过。

#pragma once

#pragma once 是另一种防止头文件被多次包含的方式,它使用了编译器特定的指令。

示例:

#pragma once

// 头文件内容

#pragma once 的优势在于它更简洁,但它是非标准的,可能不被所有编译器支持。

区别和联系:

  1. 标准与非标准#ifndef, #define, #endif 是标准的 C++ 预处理指令,而 #pragma once 是非标准的,但广泛得到支持。
  2. 可读性#pragma once 更简洁,不需要在头文件中编写两行以上的代码,而 #ifndef, #define, #endif 在需要一定的重复代码。
  3. 跨平台性#ifndef, #define, #endif 更具有跨平台性,可在不同的编译器和操作系统上使用,而 #pragma once 的跨平台性可能略逊一筹。
  4. 效率:一般来说,#pragma once 可能在某些编译器中更为高效,因为它不需要进行宏的比较和定义。

在实际编程中,选择使用哪种方式通常取决于个人或团队的偏好,以及项目的特定需求。