The multiple-declaration problem
The second header-file issue is this:
when you put a struct
declaration in a header file, it is possible for the file to be included more
than once in a complicated program. Iostreams are a good example. Any time a
struct does I/O it may include one of the iostream headers. If the cpp
file you are working on uses more than one kind of struct (typically
including a header file for each one), you run the risk of including the
<iostream> header more than once and re-declaring
iostreams.
The compiler considers the
redeclaration of a structure (this includes both
structs and classes) to be an error, since it would
otherwise allow you to use the same name for different types. To prevent this
error when multiple header files are included, you need to build some
intelligence into your header files using the preprocessor
(Standard C++ header files like <iostream>
already have this “intelligence”).
Both C and C++ allow you to redeclare a
function, as long as the two declarations match, but neither will allow the
redeclaration of a
structure.
In C++ this rule is especially important because if the compiler allowed you to
redeclare a structure and the two declarations differed, which one would it
use?
The problem of redeclaration comes up
quite a bit in C++ because each data type (structure with functions) generally
has its own header file, and you have to include one header in another if you
want to create another data type that uses the first one. In any cpp file
in your project, it’s likely that you’ll include several files that
include the same header file. During a single compilation, the compiler can see
the same header file several times. Unless you do something about it, the
compiler will see the redeclaration of your structure and report a compile-time
error. To solve the problem, you need to know a bit more about the
preprocessor.