At one time, I was of the opinion that an external should be declared each time it was used. For example: foo () { extern long foobar (); auto long fooval; fooval = foobar (); } This way, complete functions can be lifted intact from one file, and transported somewhere else without tracking down all the appropriate extern declarations. There are at least two problems with this: 1. There may be several dozen such declarations inside each function. This is a pain to type in and maintain consistent with all other such declarations. (Not to mention the visual clutter they cause.) 2. Typically functions also use preprocessor facilities such as manifest constants or macros, which are defined somewhere else anyway, thus negating the positive tranportation effect of declarations internal to each function. Because of these, and some other more subtle interactions, I was converted to the school of placing all external declarations in a single header file that every module uses. This presented problems of it's own: 1. Everytime a new declaration is added to the header file, every single module will be recompiled when using make. You start recompiling things by hand or else defeating make by "touching" things in appropriate sequence to get only the recompilations that you think are necessary. Sometimes you think wrong, which was the problem make was invented to solve in the first place. This is a very non-trivial problem with big programs that may take significant fractions of an hour to recompile everything. 2. When the "externs.h" file gets quite large, the overhead of processing it becomes noticable with small code modules. 3. When code is reused somewhere else, you must track down and extract all appropriate declarations from the header file. I have now settled on a compromise. All externals requiring explicit declaration are grouped in one place at the start of each code module. This is slightly harder to maintain when changing the type of an extern, since they must be tracked down and changed in each module that references them, but at least they are all in one place in a given module. There are also other small problems but all in all, this seems to be the most reasonable procedure.