Any C project bigger than the simple training exercises people bring here is going to include multiple source files (.c). You communicate variables and functions across those files using headers (.h) with function prototypes and extern variable names. The compiler/linker does not make multiple copies of each function it makes one copy then converts the prototypes in the headers to the address of the function. It will only be in your executable code once. (Unless you are using some monstrously deformed compiler from the Flintstone days)
Making functions static is pointless... they are static by default since they exist as a fixed entity within your program.
Here's how you do this in C....
main.c...
Code:
#include "flub.h"
int main (void)
{ int a = 4, b = 3,c = 2, d;
d = flubstuff(a,b,c);
return 0; }
flub.c...
Code:
// function to flub stuff
int flubstuff( int x, int y, int z)
{ return (x + y) * z; }
flub.h ....
Code:
#ifndef FLUB_H
#define FLUB_H
int flubstuff(int x, int y, int z); //--- note the semicolon here!
#endif //FLUB_H
So your header file is actually descrbing the function (i.e. prototyping it) and making a promise to the compiler that flubstuff() exists someplace where the linker can find it.