An in-depth exploration of module dependency transitivity in C, using the lens of mathematical relations (reflexive, symmetric, transitive). The post explains how C lacks a formal module system, relying on .c/.h file pairs by convention. It demonstrates how inline function definitions in header files create transitive compile-time dependencies between modules, pulling in unintended indirect dependencies. Practical strategies are offered to reduce coupling: splitting headers into _types.h (type definitions only) and .h (function declarations/inline definitions), or isolating inline functions in _inline.h files. Java's compile-time vs. runtime dependency behavior is also compared. The author argues that unmanaged transitive dependencies cause real problems — compile errors, MISRA static analysis failures — and advocates for keeping #includes minimal and deliberate.