Почему я могу компилировать и запускать программы на C, не включая файлы заголовков? - PullRequest
2 голосов
/ 12 мая 2011

Я проверял этот факт на Turbo C ++ 3.0, VC ++ 2008 express и Borland C ++ 6.

Если я добавлю программу C с расширением * .C в проект, я смогу скомпилировать и запустить программу, не включая файлы заголовков. Но в этом случае некоторые функции (например, sqrt () и т. Д.) Возвращают ошибочные значения.

Если я добавлю программу C с расширением * .CPP в проект, я не смогу скомпилировать и запустить программу без включения заголовочных файлов.

Почему?

Ответы [ 4 ]

7 голосов
/ 12 мая 2011

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

4 голосов
/ 12 мая 2011

По умолчанию в C функция возвращает тип int, и даже если прототип не объявлен, вы сможете использовать, например, функции libc.Конечно, если его возвращаемое значение не int, у вас есть ошибочные значения.
C ++ более строг и запрещает это.
Кроме того, gcc реализует некоторые функции как встроенные.Вы можете попробовать скомпилировать с опциями -fno-builtin, если вы его используете.

3 голосов
/ 12 мая 2011

Если вы не предоставляете объявление для функции, C делает предположение об этом.Это предположение почти всегда неверно, отсюда и ваши «ошибочные ценности».C ++ не делает этого.

2 голосов
/ 12 мая 2011

Стандарт C ++ требует, чтобы прототип функции был виден перед использованием функции.

C не имеет этого требования.Если компилятор C видит необъявленную функцию, он создает неявное объявление, предполагая, что функция возвращает int.Если функция на самом деле не возвращает int, произойдет непредсказуемое, как вы видите с sqrt.

...