Perché #ifndef e #define sono usati nei file di intestazione C ++?

Ho visto un codice come questo di solito all’inizio dei file di intestazione:

#ifndef HEADERFILE_H #define HEADERFILE_H 

E alla fine del file è

 #endif 

Qual è lo scopo di questo?

Quelli sono chiamati #include guardie .

Una volta inclusa l’intestazione, controlla se un valore univoco (in questo caso HEADERFILE_H ) è definito. Quindi se non è definito, lo definisce e continua al resto della pagina.

Quando il codice è incluso di nuovo, il primo ifndef fallisce, risultando in un file vuoto.

Ciò impedisce la doppia dichiarazione di qualsiasi identificatore come tipi, enumerazioni e variabili statiche.

 #ifndef  /* code */ #else /* code to include if the token is defined */ #endif 

#ifndef controlla se il token specificato è stato #defined precedenza nel file o in un file incluso; in caso contrario, include il codice tra esso e la chiusura #else o, se non è presente #else , l’istruzione #endif . #ifndef viene spesso utilizzato per rendere idempotenti i file di intestazione definendo un token una volta che il file è stato incluso e controllando che il token non sia stato impostato nella parte superiore del file.

 #ifndef _INCL_GUARD #define _INCL_GUARD #endif 

Ciò impedisce l’inclusione multipla dello stesso file di intestazione più volte.

 #ifndef __COMMON_H__ #define __COMMON_H__ //header file content #endif 

Supponiamo di aver incluso questo file di intestazione in più file. Quindi, la prima volta che __COMMON_H__ non è definita, verrà definita e inclusa nel file di intestazione.

La prossima volta che __COMMON_H__ è definito, quindi non includerà di nuovo.