¿El archivo de encabezado se incluye solo una vez en todo el programa?

¿El archivo de encabezado se incluye solo una vez en todo el programa?


Sé que esta es una pregunta común, pero todavía no puedo entenderla por completo.


En una C o un programa C++ generado a partir de múltiples fuentes y archivos de encabezado diferentes, ¿se incluirá cada archivo de encabezado solo una vez en el código completo cuando se usen los protectores de encabezado?


Alguien me dijo anteriormente que un archivo de encabezado (con protectores de inclusión) se incluirá solo una vez en una unidad de traducción, pero varias veces en todo el código. ¿Es esto cierto?


Si se incluye solo una vez a lo largo de todo el código, cuando un archivo desea incluirlo y el preprocesador detecta que ya se ha incluido, ¿cómo sabe ese archivo que desea utilizarlo en qué lugar del código se incluyó previamente?


Algunas respuestas de código


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