Независимо от того, объявлена ли какая-либо вещь в заголовочном файле или в исходном файле, компилятор не имеет абсолютно никакого значения.Фактически, собственно компилятор абсолютно ничего не знает ни о каких «заголовочных файлах», поскольку заголовочные файлы внедряются в исходные файлы с помощью так называемого препроцессора , который выполняет свою работу до собственно компилятора.К тому времени, когда исходные файлы (со встроенными заголовочными файлами) попадают в фактический компилятор , уже невозможно определить, что было изначально и что было вставлено из заголовочных файлов.Исходный файл со всеми вложенными в него заголовочными файлами называется единица перевода .Т.е. правильный компилятор работает с единицами перевода, а не с некоторыми файлами «источника» или «заголовка».
На языке C все объекты и функции, объявленные в области видимости файла, имеют внешнюю связь по умолчанию,Это означает, что они являются глобальными, уникальными для всей программы.Итак, вы подумали неправильно.Функции не являются локальными только для одного исходного файла.
Если вы хотите сделать функцию (или объект) локальной для одной единицы перевода, вам нужно предпринять некоторые явные шаги.Вы должны объявить это как static
.Объявление его как статического даст ему внутреннюю связь , что по сути означает, что оно становится внутренним по отношению к его единице перевода.
Объявление ваших функций static
будет работать только в том случае, если им обоим действительно придетсябыть локальным для своих собственных переводческих подразделений.Если это не так, т. Е. Если хотя бы одна из функций должна быть глобально доступной (связываемой) функцией, то у вас нет другого выбора, кроме как переименовать одну из функций.