Как иметь дело с дублированным именем функции в C?

У меня есть немного проекта, в котором я назвал две тех же функции имени в двух файлах другого источника, но в то время как я разрабатывающий проект, компилятор перестал работать с 'func_name уже определенный в filename.obj'.

Почему у меня не могло быть двух функций с тем же именем в двух файлах другого источника? Я думал, что функция должна быть локальна для исходного файла, только если, когда мы объявили, это в заголовочном файле будет он становиться глобальным.

И за исключением изменения имени файла, там какое-либо другое изящное решение дублированного имени функции на языке программирования C?

12
задан Benjamin 13 December 2013 в 18:30
поделиться

5 ответов

В C функция по умолчанию имеет глобальную область видимости. Чтобы ограничить его область действия, используйте ключевое слово static , чтобы сделать его частным для модуля.

Задача файла заголовка - просто опубликовать функцию вместе с ее подписью для других модулей.

Все глобальные имена должны (с некоторыми оговорками) быть уникальными. Это имеет смысл, потому что это имя используется компоновщиком для соединения вызова функции с реализацией самой функции.

Имена со статической и локальной областью видимости должны быть уникальными только в пределах своей области видимости.

34
ответ дан 2 December 2019 в 03:01
поделиться

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

В языке C все объекты и функции, объявленные в области видимости файла, по умолчанию имеют внешнюю связь , что означает, что они являются глобальными, уникальными для всей программы. Итак, вы ошиблись. Функции не являются локальными только для одного исходного файла.

Если вы хотите сделать функцию (или объект) локальной для одной единицы трансляции, вы должны предпринять некоторые явные шаги. Вы должны объявить его как static .Объявление его как статического даст ему внутреннюю связь , что по сути означает, что он становится внутренним по отношению к его блоку трансляции.

Объявление ваших функций static будет работать только в том случае, если они обе действительно должны быть локальными по отношению к их собственным единицам трансляции. Если это не так, то есть если хотя бы одна из функций должна быть глобально доступной (связываемой) функцией, тогда у вас нет другого выбора, кроме как переименовать одну из функций.

8
ответ дан 2 December 2019 в 03:01
поделиться

Почему у меня не могло быть двух функций с одинаковыми именами в двух разных исходных файлах?

Потому что компоновщик должен знать, что имеется в виду, когда вы на него ссылаетесь.

Представьте, что a.h и b.h оба объявляют my_function () . Компилятор генерирует код для обоих. Теперь представьте, что c.c вызывает my_function () - как компоновщик узнает, какая из двух версий функции должна быть вызвана?

7
ответ дан 2 December 2019 в 03:01
поделиться
​​

Элегантное решение - это пространства имен, представленные в C ++. Решение, если есть несколько вызовов func_name, - взять один, переименовать его и перекомпилировать.

Что-то хакерское, но быстрое решение может быть таким:

//In one of the two source files and any file that calls it

//if your functions is something like this
//void func_name(int) { ... }
//Add the following line
#define func_name SOME_UNIQUE_FUNC_NAME
3
ответ дан 2 December 2019 в 03:01
поделиться

Объявите функцию static, чтобы сделать ее локальной для файла. В языке C каждое имя идентификатора должно быть уникальным.

4
ответ дан 2 December 2019 в 03:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: