Почему простая программа в стиле «Hello World» не компилируется с Turbo C ++?

101

Я начал изучать C ++ для своего класса программирования. Я скачал эту программу "Hello World":

#include <iostream>
using namespace std;

int main() 
{
    cout << "Hello, World!";
    return 0;
}

но Turbo C ++ жалуется:

Error D:\HELLO.CPP 1: Unable to open include file 'IOSTREAM'
Error D:\HELLO.CPP 2: Declaration syntax error
Error D:\HELLO.CPP 6: Undefined symbol 'cout'

Что не так с этой очень простой программой? Как я могу исправить эти ошибки?

п. 'местоимения' м.
источник
39
Это стандартное перенаправление дублирования для вопросов о проблемах Turbo C ++. Многие из этих вопросов, как правило, быстро отбрасываются с кратким объяснением в комментариях, хотя на них действительно может быть правильный ответ. Улучшения приветствуются.
п. 'местоимения' м.
6
Предлагаем указать, какую версию Turbo C ++ вы используете. Версия 2006 года справилась с этой программой.
MM
5
«Я начал изучать C ++ для своего класса программирования». Это обман. Период.
bugwheels94 08
5
@ bugwheels94 См. это .
п. 'местоимения' м.
5
@nm Я не знаю, имели ли это в виду bugwheells, но я понял, что они означают, что если кого-то учат TurboC ++ (в частности, старый TurboC ++, который не может скомпилировать это), то они не изучают C ++ (который многие люди, включая меня , неявно предполагается, что означает стандартный C ++).
eerorika 01

Ответы:

158

С этой программой проблем нет. (За исключением, вероятно, некоторых стилистических проблем - using namespace stdне рекомендуется). Проблема в Turbo C ++. Это очень старая программа. Он реализует диалект C ++, так называемый pre-ANSI C ++ , который полностью вышел из употребления к началу этого тысячелетия. Первый стандарт ANSI для C ++ был опубликован в 1998 году, затем были версия 2003 года, версия 2011 года, версия 2014 года, версия 2017 года, и теперь мы ожидаем, что версия 2020 года будет официально опубликована. Каждая из этих редакций стандарта вносила более или менее значительные изменения в язык.

Для Turbo C ++ вам необходимо изменить программу следующим образом:

#include <iostream.h>      // note the .h suffix
// using namespace std;    // Turbo C++ doesn't implement namespaces

int main() 
{
    cout << "Hello, World!";
    return 0;
}

Если вы посмотрите на эту программу, то разница между современным диалектом C ++ и диалектом Turbo C ++ может показаться небольшой. Однако он станет намного больше по мере усложнения ваших программ.

Хотя вы можете изучать программирование с использованием Turbo C ++, я настоятельно рекомендую избегать этого, если это возможно, из-за следующих проблем:

  1. Вы будете изучать язык, который в некоторой степени похож на популярный язык, используемый в отрасли, но, тем не менее, сильно отличается, без уважительной причины. Если вы планируете писать C ++ для реальной разработки программного обеспечения, вам придется многому научиться заново. Выучить современный C ++ сразу намного проще.
  2. По Turbo C ++ нет литературы. Почти 100% материалов по C ++, которые вы найдете в Интернете или в книгах, напрямую не применимы к Turbo C ++ из коробки. Некоторым понадобится лишь небольшая доработка, а другой материал совершенно непригоден. Практически единственный источник немедленной помощи - это встроенная справка Turbo C ++.
  3. Мало кто помнит Turbo C ++. Задавая вопросы на форумах, всегда указывайте, что вы используете диалект до ANSI, чтобы отфильтровать ответы, ориентированные на современную версию языка. Вы, вероятно, получите кучу комментариев, предлагающих вам немедленно остановиться и переключиться на современный компилятор с каждым заданным вами вопросом.

Существует множество современных бесплатных (как в пиве , так и в речи ) компиляторов и IDE, которые вы можете использовать вместо Turbo C ++. Некоторые из них включают:

  1. Visual C ++ Community Edition - это IDE и компилятор от Microsoft.
  2. Code :: Blocks - это легкая IDE. В Windows он поставляется с несколько устаревшим компилятором, но вы можете установить более современный компилятор самостоятельно.
  3. Eclipse CDT - мощная кроссплатформенная IDE. Он не поставляется со своим собственным компилятором, поэтому вам необходимо установить отдельный компилятор. В Windows используйте, например, MinGW .
  4. Многое другое
  5. Кроме того, существует множество онлайн-компиляторов, таких как http://ideone.com , https://www.onlinegdb.com/ и http://coliru.stacked-crooked.com/ , а также многие другие (в основном они хороши для опробования идей и написания очень маленьких программ).
  6. И Clang / LLVM, и GCC - компиляторы бесплатного программного обеспечения, поддерживающие последние версии C ++.

К сожалению, некоторые школы / учителя, кажется, заставляют учеников использовать Turbo C ++ даже в наши дни. К сожалению, это не то, что сообщество может исправить. Если вы окажетесь в такой ситуации, приготовьтесь к тому, что не сможете получить большую помощь извне.

п. 'местоимения' м.
источник
7
@ Rakete1111 Я думаю, это больше в смысле «Эта программа не содержит проблем по текущему стандарту». Другое дело, хороший ли это стиль программирования.
Hatted Rooster
21
@ Rakete1111 нет ничего плохого в ответственном использовании using namespace std. Это может быть, а может и не быть хорошим педагогическим решением - обучать этому новых программистов, но само по себе это не является морально неправильным.
п. 'местоимения' м.
10
Я согласен, что using namespace stdэто плохая практика, но я думаю, что она относится к этому вопросу, потому что программы C ++ hello world, которые вы найдете в Интернете, почти всегда делают это. Поэтому важно понимать, что Turbo C ++ не в этом виноват. Возможно, вместо «С этой программой проблем нет» скажите: «Эта программа действительна в соответствии с текущим стандартом C ++; она должна компилироваться».
zwol 01
5
@Puppy к тому же, все вызовы стандартных функций безответственны, потому что вы не знаете, какие новые перегрузки будут добавлены. Вы также не знаете, какие языковые особенности исчезнут из следующего стандарта или изменят значение. Не все программы должны жить десятилетиями или быть переносимыми на произвольные компиляторы.
п. 'местоимения' м.
6
«Мало кто помнит Turbo C ++» Я не согласен. Сегодня этому активно обучают как минимум одну большую страну .
Гонки
11

«Turbo C ++» может означать множество компиляторов. Задавая этот вопрос, важно указать номер версии.

  • Borland Turbo C ++ до версии 3.1 представлял собой чистые компиляторы MS DOS в классической среде IDE с синим фоном. Они были выпущены примерно где-то между 1989 и 1992 годами, задолго до того, как C ++ стал стандартизированным, что произошло в 1998 году. И поэтому они использовали предстандартный диалект C ++.

    В частности, они использовали #include <iostream.h>синтаксис, а не стандарт #include <iostream>, но также не охватывали целый ряд функций C ++, таких как пространства имен, шаблоны и т. Д. Библиотека шаблонов STL еще не была частью стандарта, поэтому все, что связано с этой библиотекой, было довольно отличается от того, что позже стало стандартом.

  • Позже, в 90-х, Borland выпустила несколько компиляторов DOS / Windows с лучшей совместимостью. Где-то до версии 5 они все еще боролись с полным соответствием C ++ 98, хотя эти версии Windows были довольно близки к нему.

  • В конце 90-х они отказались от названия «Turbo C ++» в пользу Borland C ++ Builder, который был не просто IDE, а полноценным инструментом RAD на основе Delphi. Эти компиляторы полностью совместимы с C ++ 98 и более поздними версиями C ++ 03.

  • Примерно в 2005 году Borland отказалась от компиляторов как части своей линейки продуктов. Компиляторами стала компания «Codegear», которая позже стала Embarcadero. Примерно в то время они выпустили бесплатную версию Borland Builder, которую назвали «Turbo C ++». Эта версия полностью соответствовала C ++ 03.

  • В настоящее время эти компиляторы называются Embarcadero C ++ Builder. Я считаю, что в настоящее время они поддерживают C ++ 11 с некоторым C ++ 14. Больше информации здесь.

Излишне говорить, что в студенческие годы вы не должны использовать ничего, кроме современных компиляторов. Использование компиляторов MS DOS 1991 года при изучении C ++ в 2018 году - просто безумие. Это не только контрпродуктивно, но и напрямую вредно и сделает вас плохим программистом на C ++. Если ваша школа вынуждает вас использовать Turbo C ++ 3.1 или более раннюю версию, то ваша школа плохая, а ваши учителя крайне некомпетентны. Пожалуйста, свяжите этот пост с ними и их руководителем.

Лундин
источник
Turbo C ++ по- прежнему распространен в Индии в 2020 году . Все больше и больше - «Это устаревший на 40 лет Turbo C. Индийские колледжи все еще преподают его и отказываются преподавать чему-либо еще. Они дали мне нулевые оценки, потому что я использовал его std::stringвместо char *экзаменов, потому что они не знают, что C ++ стандартизирован и char *устарела." .
Питер Мортенсен,
@PeterMortensen Да ... это неплохо для обучения C90 (забавно, но он все еще лучше, чем Visual Studio с 2020 года), но диалект C ++, который он использовал, был просто ненормальным.
Лундин,
7

Turbo C ++ - очень старый компилятор, который немного отличается от компилятора GNU C ++. Код, которым вы поделились, будет отлично работать с компилятором GNU, но для его запуска с Turbo C ++ вам нужно внести несколько изменений:

1. Измените имя файла заголовка с iostreamна iostream.h
2. И удалите строку «using namespace std». Это не так. требуется в Turbo C ++. Вот модифицированный код:

#include <iostream.h>

int main() 
{
  cout << "Hello, World!";
  return 0;
}
Юганш Тхакур
источник
6
Что ваш ответ добавляет, а в принятом - нет?
Rakete1111
7
суть для людей, у которых нет времени читать длинные ответы.
Yougansh Thakur
он не «немного отличается», но сильно отличается от компиляторов C ++
phuclv