Program-level interprocedural analysis imposes some requirements and limitations on the source code files that the compiler translates:
Dependencies Among Source Files
A change to even a single source file in a program still requires that the compiler read and analyze all files in the program, even those files that are not dependent on the changed file. This requirement significantly increases compile time.
Function and Top-level Variable Declarations
Because the compiler treats all files that compose a program as if they were a single, large source file, you must make sure all non-static declarations for variables or functions with the same name are identical.
Type Definitions
Because the compiler examines all source files for a program, make sure all definitions for a type are the same.
Unnamed Structures and Enumerations in C
The C language allows anonymous struct and enum definitions in type definitions. Using such definitions prevents the compiler from properly applying program-level interprocedural analysis.