Avatar ·

#pragma once contra include guards: qué elegir para la protección contra la inclusión múltiple

¡Hola a todos! Soy un desarrollador principiante de C++ y ya me he encontrado varias veces con el problema de la doble inclusión de archivos de encabezado. Por ejemplo, tengo este código:

// 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"  // accidentalmente incluido dos veces

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

Con include guards todo funciona, pero noté que muchos proyectos modernos (por ejemplo, de Boost) usan #pragma once. Leí que es una directiva no estándar, pero es compatible con todos los compiladores principales.

Me interesa saber:

  • ¿Hay problemas reales de rendimiento con include guards?
  • ¿Por qué se considera #pragma once una solución más "limpia"?
  • ¿Puede #pragma once provocar errores si el archivo se copia o está en diferentes carpetas?
  • ¿Qué se prefiere en el código de producción?