Такая вот ситуация,у меня есть хидер где прописанна функция и есть .с файл где эта функция реализованна. Так вот я чисто случайно :) забыл включить мой хидер в тот файл где я хотел использовать мою функцию а во время компиляции компайлер мне ничего не сказал. То есть ему глубоко плевать на это знает ли вызывающая функция вызываемую или нет. К прмеру делаем ошибку и в вызове имя моей функции немного меняем, получаем что мы вызываем какуюто не известную функцию. И ни чего при компиляции все в порядке, лишь при линковке сообщается, что нет такой функции в объектных файлах. Так вот вопрос это Си (имеется ввиду стандарт) или компилятор, Причем такое на нескольких типах компиляторов опробыванно было и на разных типах Unix, то есть если это не стандарт то значит гдето в Makefile, только я вот не знаю что искать, поверните меня в правильную сторону.
Здравствуйте the_moon, Вы писали:
TM>Привет программисты и кодеры,
TM>Такая вот ситуация,у меня есть хидер где прописанна функция и есть .с файл где эта функция реализованна. Так вот я чисто случайно :) забыл включить мой хидер в тот файл где я хотел использовать мою функцию а во время компиляции компайлер мне ничего не сказал. То есть ему глубоко плевать на это знает ли вызывающая функция вызываемую или нет. К прмеру делаем ошибку и в вызове имя моей функции немного меняем, получаем что мы вызываем какуюто не известную функцию. И ни чего при компиляции все в порядке, лишь при линковке сообщается, что нет такой функции в объектных файлах. Так вот вопрос это Си (имеется ввиду стандарт) или компилятор.
Да, это стандарт С. Если функция не объявлена, то компилятор сам строит предположительное объявление этой функции на основе анализа типа передаваемых аргументов и количества этих аргументов. В качестве типа возвращаемого значения предполагается 'int'.
Если функция с таким именем в программе действительно есть и построенное таким образом предположительное объявление совпадет с реальным, то считай, что тебе повезло. Программа нормально скомпилируется и будет работать.
Если функции с таким именем в программе нет, то будет ругаться линкер.
Если функция с таким именем в программе есть, но построенное предположительное объявление не совпадет с реальным, то программа скомпилируется, но в 9 случаях из 10 будет глючить.
В общем, прежде чем вызывать функции, их надо объявлять.
Стандарт же С++, в отличие от стандарта С, требует в такой ситуации немедленного рапорта об ошибке компиляции.