Avatar ·

#pragma once 对比 include guards:如何选择防止重复包含?

大家好!我是一名初学 C++ 的开发者,已经多次遇到头文件双重包含的问题。例如,我有这样的代码:

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b) { return a + b; }

#endif

// main.cpp
#include "math_utils.h"
#include "math_utils.h"  // 不小心包含了两次

int main() {
    return add(2, 3);
}

使用 include guards 一切正常,但我注意到许多现代项目(例如来自 Boost 的项目)使用 #pragma once。我了解到这是一个非标准指令,但所有主流编译器都支持它。

我感兴趣的是:

  • include guards 是否存在实际的性能问题?
  • 为什么 #pragma once 被认为是更“干净”的解决方案?
  • 如果文件被复制或位于不同文件夹中,#pragma once 是否会导致错误?
  • 应该写什么