$ cat a.c #include "h.h" void a(void) { inc(__func__); } $ cat b.c #include "h.h" void b(void) { inc(__func__); } $ cat counter.c #include void inc(const char *s) { static int counter = 0; printf("%s:\t%d\n", s, counter++); } $ cat main.c #include #include "h.h" int main() { a(); b(); inc(__func__); a(); b(); inc(__func__); a(); b(); inc(__func__); return 0; } $ cat h.h void inc(const char *s); void a(void); void b(void); $ gcc -Wall -c -o main.o main.c $ gcc -Wall -c -o a.o a.c $ gcc -Wall -c -o b.o b.c $ gcc -Wall -c -o counter.o counter.c $ gcc main.o a.o b.o counter.o -o main $ ./main a: 0 b: 1 main: 2 a: 3 b: 4 main: 5 a: 6 b: 7 main: 8