Помощь - Поиск - Пользователи - Календарь
Полная версия: include || !include
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
SkIv
недавно начал изучать с++, столкнулся с такой интересной штукой
Код
//#include <stdio.h>

int main (void)
{
     puts("hello world!");
    
}

код выше спокойно компилируется компилятором С, а вот при компилировании на С++ вылазит ошибка: "identifier not found" может кто-нибудь объяснить почему так происходит?
volvo
Цитата
может кто-нибудь объяснить почему так происходит?
Потому что в С++ (в отличие от чистого С) вызову функции должно обязательно предшествовать ее объявление или описания. Описание функции puts находится в файле stdio.h, поэтому если его при-include-ить к программе, то программа становится правильной с точки зрения С++, если нет - то программа некорректна, и компилироваться не будет.
SkIv
это я понимаю, я не понимаю как она в Си находит определение этой функции
volvo
А с чего ты взял, что в С нужно определение этой функции? Ты внимательно на предупреждения компилятора смотрел? Там же написано: warning: implicit declaration of function `puts' - "неявное объявление функции puts", то есть, функция объявлена неявно, теперь задача линкера найти реализацию этой функции в библиотеках, с чем, как видишь, он прекрасно справляется.

А вот чтобы избавиться от предупреждения, надо подключить stdio.h, чтобы компилятор смог убедиться, что такая функция существует в одной из библиотек. Вот это, скажем:
int main (void)
{
printf("result = %5.2f", mysin(3.14 / 4));
}
при компиляции в С выдает такое же предупреждение, как в первой программе, но при попытке слинковать программу, получаем ошибку линкера: он не нашел в стандартных библиотеках функции mysin.

А в С++ более серьезные проверки типов, и такие вещи ловятся еще на этапе компиляции.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.