Согласно C Программирование (Deitel):Кто определяет имя функции с ошибкой? Компилятор или компоновщик?
Стандартные библиотечные функции, такие как Printf и зсапЕ не являются частью языка программирования C. Например, компилятор не может найти орфографическую ошибку в printf или scanf. Когда компилятор компилирует оператор printf, он просто предоставляет пространство в объектной программе для «вызова» функции библиотеки. Но компилятор не знает, где функции библиотеки - это компоновщик. Когда компоновщик работает, он находит функции библиотеки и вставляет правильные вызовы этим библиотечным функциям в объектной программе. Теперь объектная программа завершена и готова к выполнению. По этой причине связанная программа называется исполняемым. Если имя функции написано с ошибкой, - это компоновщик, который обнаружит ошибку, потому что она не сможет сопоставить имя в программе C с именем любой известной функции в библиотеках.
Эти заявления оставляют меня сомнительными из-за существования файла заголовка. Эти файлы включаются во время фазы предварительной обработки, перед компиляцией и, как я прочитал, используются компилятором.
Так что, если я пишу print
вместо printf
, как не может компилятор увидеть, что нет функции, объявленной с этим именем, и выбросить ошибку?
Если это так, как говорится в книге, почему я могу объявить функцию в заголовочных файлах, если компилятор их не наблюдает?
Компилятор может видеть, что функция не объявлена с этим именем и не выдает ошибку. Это зависит от параметров компилятора и версии C. – chux
Современный компилятор должен хотя бы дать предупреждение во время компиляции. Но некоторые компиляторы делают предположения о отсутствующем объявлении функции, и компоновщик затем найдет ошибку. Включите все предупреждения компилятора, потому что, если функция существует, но не была объявлена, эти допущения могут быть неправильными. –
Обратите внимание, что некоторые опечатки заканчиваются тем, что вызывали другую объявленную функцию из той, которая была предназначена. Иногда компилятор может заметить это - если параметры функции в вызове не совпадают с прототипом. Иногда ни компилятор, ни компоновщик не могут это заметить - если параметры функции в вызове совпадают с прототипом, но это просто неправильная функция. –