Avatar ·

#pragma once vs include guards: o que escolher para proteção contra inclusão múltipla?

Olá a todos! Sou um desenvolvedor C++ iniciante e já me deparei várias vezes com o problema de inclusão dupla de arquivos de cabeçalho. Por exemplo, tenho 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"  // incluí acidentalmente duas vezes

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

Com include guards tudo funciona, mas notei que muitos projetos modernos (como os do Boost) usam #pragma once. Li que esta é uma diretiva não padrão, mas é suportada por todos os principais compiladores.

Estou interessado em:

  • Existem problemas reais de desempenho com include guards?
  • Por que #pragma once é considerada uma solução mais "limpa"?
  • #pragma once pode causar erros se o arquivo for copiado ou estiver em pastas diferentes?
  • O que escre