Domanda

Sono 'ridondante includere guardie' necessario CodeGear RAD Studio 2009? È il compilatore abbastanza intelligente per affrontare questo su di essa la propria?

Per esempio, potrei avere il seguente 'include guard' in foo.h:

#ifndef fooH
#define fooH
// ... declaration here
#endif

e il seguente 'ridondante include guard' in use_foo.h:

#ifndef fooH
    #include "foo.h"
#endif

Inoltre, se il compilatore non è abbastanza intelligente, sono 'ridondanti includono guardie necesarry se vengono inclusi in un file di origine. per esempio. use_foo.cpp. ?

È stato utile?

Soluzione

La porzione del codice contrassegnato come "ridondante includono guardia" non è necessario ma è un possibile di ottimizzazione.

Nel caso di C ++ Builder, c'è una logica per rilevare guardie di intestazione, quindi non dovrebbe essere necessario.

Nel caso generale, il passaggio di pre-elaborazione è di solito abbastanza veloce in ogni caso, quindi è improbabile che questo ottimizzazione avrebbe acquistato molta comunque.

Altri suggerimenti

Queste ridondanti includono guardie hanno lo scopo di emulare la funzionalità della direttiva #pragma once proposta: se alcuni file di intestazione è già stato inserito, quindi il preprocessore non sarà nemmeno tentare di localizzare, aperto e analizzarlo più (come avrebbe dovuto con il "ordinario" comprendono tecnica guardia). In molti casi, questo rende la manipolazione di file include molto più efficienti (velocizza la compilazione).

Questo approccio è ovviamente un high-manutenzione uno: bisogna fare in modo che l'ortografia del simbolo guardia è esattamente lo stesso all'interno del file di intestazione e al di fuori

.

Il "ridondante includere guardia", come lo chiami tu, accelera la compilazione.

Senza la guardia ridondante, il compilatore iterare l'intero file foo.h, alla ricerca di qualche codice che potrebbe essere al di fuori del blocco #ifndef. Se si tratta di un file lungo, e questo è fatto molti luoghi, il compilatore potrebbe perdere un sacco di tempo. Ma con la guardia ridondante, si può saltare l'intera istruzione #include e nemmeno ritornare su tale file.

Naturalmente, dovreste sperimentare e vedere l'effettiva quantità di tempo sprecato dal compilatore scorrendo foo.h e non in realtà la compilazione nulla; e, forse, i compilatori moderni in realtà cercano questo modello e automaticamente non sanno preoccuparsi di aprire il file a tutti, non so.

(Inizia modifica di 280Z28)

La seguente struttura dell'intestazione è riconosciuto da almeno GCC e MSVC. Usando questo modello nega praticamente tutti i benefici che si può ottenere con le guardie nei file incluso. Si noti che i commenti vengono ignorati quando il compilatore esamina la struttura.

// 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

(End edit)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top