If a C program were only allowed to declare each object or function once, there would be no need for compatible types. But linkage (which allows two or more declarations to refer to the same entity), function prototypes, and separate compilation all need such a capability. Not too surprisingly, separate translation units (source files) have different rules for type compatibility than within a single translation unit.