Eu tenho visto um código como este geralmente no início dos arquivos de cabeçalho:
#ifndef HEADERFILE_H
#define HEADERFILE_H
E no final do arquivo é
#endif
Qual é o propósito disso?
c++
c
c-preprocessor
Asad Khan
fonte
fonte
#pragma
é: ele ativa um recurso específico do compilador. Embora#pragma once
seja muito amplamente apoiada, é fora do padrão.info cpp
ou veja aqui ) diz "ela não é reconhecida por todos os pré-processadores, portanto você não pode confiar nela em um programa portátil". E o GNU cpp otimiza o#ifndef
idioma comum e portátil, tornando-o tão eficiente quanto#pragma once
.#ifndef HEADERFILE_H
pode violar o namespace da implementação do nome do cabeçalho que acontece com o inícioE
; os identificadores que começam comE
e um dígito ou letra maiúscula são reservados para<errno.h>
. Eu sugiro#ifndef H_HEADERFILE
.Respostas:
Esses são chamados de #include guardas .
Uma vez incluído o cabeçalho, ele verifica se um valor único (neste caso
HEADERFILE_H
) está definido. Então, se não estiver definido, ele será definido e continuará no restante da página.Quando o código é incluído novamente, o primeiro
ifndef
falha, resultando em um arquivo em branco.Isso evita a declaração dupla de qualquer identificador, como tipos, enumerações e variáveis estáticas.
fonte
#pragma once
que faz o mesmo :-)#pragma once
não é portátil; o#ifndef
idioma comum é recomendado.#ifndef
verifica se o token fornecido foi#defined
anteriormente no arquivo ou em um arquivo incluído; caso contrário, inclui o código entre ele e a declaração de fechamento#else
ou, se não#else
houver, é frequentemente usado para tornar os arquivos de cabeçalho idempotentes, definindo um token depois que o arquivo foi incluído e verificando se o token não foi definido na parte superior do arquivo.#endif
#ifndef
fonte
#ifndef H_HEADER_NAME
.Isso impede a inclusão múltipla do mesmo arquivo de cabeçalho várias vezes.
Suponha que você incluiu esse arquivo de cabeçalho em vários arquivos. Portanto, a primeira vez que __COMMON_H__ não for definida, ela será definida e o arquivo de cabeçalho será incluído.
Da próxima vez que __COMMON_H__ for definido, não será incluído novamente.
fonte
Eles são chamados ifdef ou incluem guardas.
Se estiver escrevendo um pequeno programa, pode parecer que não é necessário, mas à medida que o projeto cresce, você pode intencional ou involuntariamente incluir um arquivo várias vezes, o que pode resultar em um aviso de compilação como a variável já declarada.
Se não for declarado, o que significa que #ifndef gera true, apenas a parte entre #ifndef e #endif executada de outra forma não. Isso impedirá de declarar novamente os identificadores, enumerações, estrutura, etc.
fonte