São redundantes incluem guardas necessário?
-
19-09-2019 - |
Pergunta
Você 'redundante incluem guardas' necessário Codegear RAD Studio 2009? É o suficiente inteligente compilador para lidar com isso, por si própria?
Por exemplo, eu poderia ter o seguinte 'incluem guarda' em foo.h:
#ifndef fooH
#define fooH
// ... declaration here
#endif
ea seguinte 'redundante incluem guarda' em use_foo.h:
#ifndef fooH
#include "foo.h"
#endif
Além disso, se o compilador não é suficiente inteligente, são 'redundantes incluem guardas' necesarry se eles estão sendo incluídos em um arquivo de origem. por exemplo. use_foo.cpp
. ?
Solução
A parte do código marcado como "redundante incluem guarda" não é necessário, mas é uma possível otimização.
No caso do C ++ Builder, há uma lógica para detectar guardas de cabeçalho, por isso não deve ser necessário.
No caso geral, o passe pré-processamento é geralmente muito rápido de qualquer maneira, por isso é improvável que este otimização iria comprar-lhe muito de qualquer maneira.
Outras dicas
Estes redundante incluem guardas têm a intenção de emular a funcionalidade da directiva #pragma once
proposta: se algum arquivo de cabeçalho já foi incluído, em seguida, o pré-processador não vai mesmo tentar localizar, aberto e analisá-lo mais (como ele teria que com o "comum" incluem técnica de guarda). Em muitos casos, isso torna o manuseio de arquivos de inclusão muito mais eficientes (acelera compilação).
Esta abordagem é, obviamente, uma alta manutenção:. A pessoa tem que se certificar de que a ortografia do símbolo guarda é exatamente o mesmo dentro do arquivo de cabeçalho, bem como fora
O "redundante incluem guarda", como lhe chamam, acelera compilação.
Sem o guarda redundante, o compilador irá iterar todo o arquivo foo.h, à procura de algum código que pode estar fora do bloco #ifndef
. Se for um arquivo longo, e isso é feito muitos lugares, o compilador pode perder muito tempo. Mas, com o guarda redundante, ele pode pular toda a instrução #include
e nem reabrir o arquivo.
É claro, você tem que experimentar e ver a quantidade real de tempo desperdiçado pela iteração compilador através foo.h e não realmente compilar nada; e talvez compiladores modernos realmente olhar para este padrão e automaticamente sabe que não deve se preocupar abrir o arquivo em tudo, eu não sei.
(Comece a editar pela 280Z28)
O seguinte estrutura de cabeçalho é reconhecido por pelo menos, GCC e MSVC. Usando este padrão nega praticamente todos os benefícios que você poderia ganhar com guardas nas incluindo arquivos. Nota que os comentários são ignorados quando o compilador examina a estrutura.
// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED
// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// header text goes here.
#endif
(edit End)