Вы не включаете исходный файл в другой, вы компилируете и связываете их вместе.
В вашем случае, говоря #include "a.c"
, вы по существу помещаете весь контент a.c
в b.c
и затем запускаете компиляцию, чтобы функции static
и их вызовы присутствовали в одном и том же переводе. Блок. Таким образом, для компилятора не возникает проблем с поиском вызываемой функции.
Вместо этого, если вы делаете что-то вроде
gcc a.c b.c -o a.out //try to compile and link together
вы увидите ожидаемую ошибку, так как в этом случае a.c
и b.c
будут двумя отдельными единицами перевода.