The name of an object of function is called its identifier.
A translation unit is one source file being compiled as it appears after each #include directive in it is replaced with the contents of the included file.
In C, an identifier used in one place can refer to an identifier defined in a different place through a process called linkage.
When an object or function is declared at file scope (outside of any function), it has external linkage by default. With external linkage, an identifier used in one translation unit can refer to an identifier defined in another translation unit.
When you execute cc main.c func.c -o program, the command compiles main.c as one translation unit and separately compiles func.c as another translation unit. These compilations produce two temporary object files, and the command links those object files together.
When main.c has #include "func.c", the definition of call is included in main.c and is part of that translation unit. So this translation unit has a definition of call with external linkage.
You also compile func.c, and this translation unit also has a definition of call with external linkage.
When there are two definitions of the same identifier with external linkage, the C standard does not define the behavior. Most commonly, when there are two ordinary definitions of a symbol in object files, the linker reports an error.
When you define call with static int call(void), that changes its linkage to internal linkage. Internal linkage limits resolution of an identifier to the translation unit it is declared in. Then the use of call in main is resolved to the call that is defined in main.c, and the call that is defined in func.c is not involved and does not cause any conflict.
#include func.cthen you should not have it incc main.c func.c -o program.main.ctranslation unit when you build it, considering that#includeis a literal inclusion of files..cextension is intended to be separately compiled, while a file with a.hextension is intended to be included. Otherwise there is no difference, they are just text files. You could use#include "func.xyz", the compiler doesn't care. We poor humans do care, so it is better to follow the convention.