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. ?

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top