File di intestazione incluso solo una volta nell'intero programma?

File di intestazione incluso solo una volta nell'intero programma?


So che questa è una domanda comune, ma non riesco ancora a capirla completamente.


In una C o un programma C++ generato da più file di intestazione e di origine diversi, ogni file di intestazione verrà incluso solo una volta nell'intero codice quando vengono utilizzate le protezioni dell'intestazione?


Qualcuno mi ha detto in precedenza che un file di intestazione (con protezioni di inclusione) verrà incluso solo una volta in un'unità di traduzione ma più volte nell'intero codice. È vero?


Se viene incluso solo una volta nell'intero codice, quando un file desidera includerlo e il preprocessore rileva che è già stato incluso, come fa quel file che desidera usarlo a sapere dove si trova nel codice in cui era precedentemente incluso?


Alcune risposte al codice


source
header source header header \
/
\ |
/ /
\
/
\ |
/ / PREPROCESSORPREPROCESSOR
|
|
V
V preprocessed code
preprocessed code
|
|
COMPILER COMPILER
|
|
V
V object code object code \/ \
/ \
/
LINKER
|
V executable
#ifndef EXAMPLE_H #define EXAMPLE_H  // header contents  #endif 
#pragma once  // header contents 
#ifndef MY_HEADER_H #define MY_HEADER_H  ....  #endif