4.7.2. El problema de la declaración múltiple

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.