once
pragma
Especifica que o arquivo de cabeçalho será incluído apenas uma vez pelo compilador ao compilar um arquivo de código-fonte.
Sintaxe
#pragma once
Comentários
O uso de #pragma once
pode reduzir os tempos de build, pois o compilador não abrirá e lerá o arquivo novamente após o primeiro #include
do arquivo na unidade de tradução. Isso se chama otimização de várias inclusões. Ela tem um efeito semelhante à expressão de proteção de inclusão, que usa definições de macro de pré-processador para evitar várias inclusões do conteúdo do arquivo. Ela também ajuda a evitar violações da regra de uma definição: o requisito de que todos os modelos, tipos, funções e objetos não tenham mais de uma definição em seu código.
Por exemplo:
// header.h
#pragma once
// Code placed here is included only once per translation unit
Recomendamos a diretiva #pragma once
para código novo porque ela não polui o namespace global com um símbolo de pré-processador. Ela requer menos digitação, é menos perturbadora e não pode causar colisões de símbolo. Colisões de símbolo são erros causados quando arquivos de cabeçalho diferentes usam o mesmo símbolo de pré-processador do valor de proteção. Isso não faz parte do C++ Standard, mas é implementado com portabilidade por vários compiladores comuns.
Não há nenhuma vantagem em usar a expressão de proteção de inclusão e #pragma once
no mesmo arquivo. O compilador reconhece a linguagem de proteção de inclusão e implementa a otimização de várias inclusões da mesma maneira que a diretiva #pragma once
se nenhum código ou diretiva de pré-processador não comentados vierem antes ou depois da forma padrão da expressão:
// header.h
// Demonstration of the #include guard idiom.
// Note that the defined symbol can be arbitrary.
#ifndef HEADER_H_ // equivalently, #if !defined HEADER_H_
#define HEADER_H_
// Code placed here is included only once per translation unit
#endif // HEADER_H_
Recomendamos a expressão de proteção de inclusão quando o código tiver que ser portátil para compiladores que não implementam a diretiva #pragma once
, para manter a consistência com o código existente, ou quando não for possível a otimização de várias inclusões. Isso pode ocorrer em projetos complexos quando caminhos de inclusão dos objetos que recebem ou receberam aliasing do sistema de arquivos impedem que o compilador identifique arquivos de inclusão idênticos por caminho canônico.
Tenha cuidado para não usar #pragma once
ou incluir a expressão de proteção em arquivos de cabeçalho projetados para serem incluídos várias vezes, pois eles usam símbolos de pré-processador para controlar seus efeitos. Para obter um exemplo desse design, consulte o arquivo de cabeçalho <assert.h>. Tenha também o cuidado de gerenciar seus caminhos de inclusão para evitar a criação de vários caminhos para arquivos incluídos, o que pode prejudicar a otimização de vários inclusões para proteção de inclusão e #pragma once
.