#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 onceuna solución más "limpia"? - ¿Puede
#pragma onceprovocar errores si el archivo se copia o está en diferentes carpetas? - ¿Qué se prefiere en el código de producción?