Является ли "компиляция в порядке" только в теории, или вы действительно проверяли это?
Функция static
не должна быть видна снаружи модуля компиляции (обычно файла C), в котором он находится.
Объявление функции с тем же именем с extern
в другом модуле компиляции не должно изменить это.
Убедитесь, что вы действительно собрали и связываете тестовую программу должным образом, поскольку в противном случае все, что вы тестируете, это то, что вы можете иметь "висячую" ссылку на внешний символ (ссылка на функцию foo
из 2.c). Сборка 2.c в исполняемый файл (т. Е. Его связывание) должна завершиться неудачей.