La segunda cuestión respecto a los ficheros de cabecera es ésta:
cuando se pone una declaración de struct
en
un fichero de cabecera, es posible que el fichero sea incluido
más de una vez en un programa complicado. Los iostreams son un
buen ejemplo. Cada vez que una struct
hace
E/S debe incluir uno de los ficheros de cabecera iostream. Si el
fichero cpp
sobre el que se está trabajando
utiliza más de un tipo de struct
(típicamente
incluyendo un fichero de cabecera para cada una), se está
corriendo el riesgo de incluir el fichero
<isotream>
más de una vez y re-declarar
los iostreams.
El compilador considera que la redeclaración de una estructura
(eso es aplicable tando a las struct
como a las
class
) es un error, dado que de otro modo, debería
permitir el uso del mismo nombre para tipos diferentes. Para
evitar este error cuando se incluyen múltiples ficheros de
cabecera, es necesario dar algo de inteligencia a los ficheros
de cabecera usando el preprocesador (los ficheros de cabecera
estándares como <iostream>
también
tienen esta «inteligencia»).
Tanto C como C++ permiten redeclarar una función, siempre que las dos declaraciones coincidan, pero ni en ese caso se permite la redeclaración de una estructura. En C++ esta regla es especialmente importante porque si el compilador permitiera la redeclaración de una estructura y las dos declaraciones difirieran, ¿cuál debería usar?
El problema de la redeclaración se agrava un poco en C++ porque
cada tipo de dato (estructura con funciones) generalmente tiene
su propio fichero de cabecera, y hay que incluir un fichero de
cabecera en otro si se quiere crear otro tipo de dato que use al
primero. Es probable que en algún fichero
cpp
de su proyecto, que se incluyan varios
ficheros que incluyan al mismo fichero de cabecera. Durante una
compilación simple, el compilador puede ver el mismo fichero de
cabecera varias veces. A menos que se haga algo al respecto, el
compilador verá la redeclaración de la estructura e informará un
error en tiempo de compilación. Para resolver el problema,
necesitará saber un poco más acerca del preprocesador.