This question comes from a colleague, who works on compilers.
Given the definition `int x;` (without an initializer) in a source file the corresponding object contains `x` in a "common" section. What this means is that, at link time, if some object file explicitly allocates an 'x' (e.g., by specifying an initializer, so that 'x' appears in the data section for that object file), use that; otherwise, allocate space for it at link time, possibly in the BSS. If several source files contain such a declaration, the linker allocates exactly one 'x' (or whatever identifier) as appropriate. We've verified that this behavior was present as early as 6th edition.
The question is, what is the origin of this concept and nomenclature? FORTRAN, of course, has "common blocks": was that an inspiration for the name? Where did the idea for the implicit behavior come from (FORTRAN common blocks are explicit).
My colleague was particularly surprised that this seemed required: even at this early stage, the `extern` keyword was present, so why bother with this behavior? Why not, instead, make it a link-time error? Please note that if two source files have initializers for these variables, then one gets a multiple-definition link error. The 1988 ANSI standard made this an error (or at least undefined behavior) but the functionality persists; GCC is changing its default to prohibit it (my colleague works on clang).
Doug? Ken? Steve?
- Dan C.