Dlaczego prosty program w stylu „Hello World” nie można skompilować z Turbo C ++?

101

Zacząłem uczyć się C ++ dla mojej klasy programowania. Pobrałem ten program „Hello World”:

#include <iostream>
using namespace std;

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

ale Turbo C ++ narzeka:

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'

Co jest nie tak z tym bardzo prostym programem? Jak mogę poprawić te błędy?

n. zaimki m.
źródło
39
Ma to być standardowe przekierowanie typu dupe dla pytań dotyczących problemów z Turbo C ++. Wiele z tych pytań jest zwykle szybko odrzucanych, a jedynie krótkie wyjaśnienie w komentarzach, podczas gdy naprawdę można użyć właściwej odpowiedzi. Mile widziane ulepszenia.
n. zaimki m.
6
zasugeruj wzmiankę, której wersji Turbo C ++ używasz. Wersja 2006 poradziła sobie z tym programem.
MM
5
„Zacząłem uczyć się języka C ++ dla mojej klasy programowania”. To jest kłamstwo. Kropka.
bugwheels94
5
@ bugwheels94 Zobacz to .
n. zaimki m.
5
@nm Nie wiem, czy to oznaczało bugwheells, ale uznałem je za to, że jeśli ktoś uczy się TurboC ++ (w szczególności starego TurboC ++, które nie potrafi tego skompilować), to nie uczy się C ++ (co wielu ludzi, w tym ja , zakłada niejawnie, że oznacza standardowy C ++).
eerorika

Odpowiedzi:

158

Nie ma problemu z tym programem. (Poza pewnymi problemami stylistycznymi - using namespace stdnie jest to zalecane). Problem dotyczy Turbo C ++. To bardzo stare oprogramowanie. Implementuje dialekt C ++, tak zwany pre-ANSI C ++ , który całkowicie wypadł z użycia na początku tego tysiąclecia. Pierwszy standard ANSI dla C ++ został opublikowany w 1998 roku, potem była wersja 2003, 2011, 2014, 2017, a teraz spodziewamy się oficjalnej publikacji wersji 2020. Każda z tych standardowych poprawek przyniosła mniej lub bardziej istotne zmiany w języku.

W przypadku Turbo C ++ musisz zmodyfikować program w następujący sposób:

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

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

Jeśli spojrzysz na ten program, różnica między współczesnym dialektem C ++ a tym akceptowanym przez Turbo C ++ może wydawać się niewielka. Jednak będzie znacznie większy, ponieważ Twoje programy będą stawały się bardziej złożone.

Chociaż możesz nauczyć się programowania przy użyciu Turbo C ++, zdecydowanie zalecam unikanie tego, jeśli to tylko możliwe, z powodu następujących problemów:

  1. Będziesz uczyć się języka, który jest nieco podobny do popularnego języka używanego w branży, ale jest bardzo różny bez żadnego powodu. Jeśli planujesz pisać w C ++ dla prawdziwego rozwoju oprogramowania, będziesz musiał wiele się ponownie nauczyć. O wiele łatwiej jest od razu nauczyć się współczesnego C ++.
  2. Nie ma istniejącej literatury na temat Turbo C ++. Prawie 100% materiałów C ++, które znajdziesz w Internecie lub w książkach, nie ma bezpośredniego zastosowania w Turbo C ++ po wyjęciu z pudełka. Niektóre będą wymagały jedynie niewielkiej adaptacji, podczas gdy inne materiały są całkowicie bezużyteczne. Prawie jedynym źródłem natychmiastowej pomocy jest wbudowana pomoc Turbo C ++.
  3. Niewiele osób pamięta Turbo C ++. Zadając pytania na forach, zawsze zaznaczaj, że używasz dialektu sprzed ANSI, aby odfiltrować odpowiedzi dostosowane do współczesnej wersji języka. Prawdopodobnie otrzymasz kilka komentarzy sugerujących natychmiastowe zatrzymanie i przejście na nowoczesny kompilator z każdym zadanym pytaniem.

Istnieje wiele nowoczesnych darmowych (tak jak w piwie , a także w mowie ) kompilatorów i IDE, których można używać zamiast Turbo C ++. Niektóre z nich obejmują:

  1. Visual C ++ Community Edition to IDE i kompilator firmy Microsoft
  2. Code :: Blocks to lekkie środowisko IDE. W systemie Windows jest dostarczany z nieco przestarzałym kompilatorem, ale możesz samodzielnie zainstalować bardziej nowoczesny kompilator
  3. Eclipse CDT to potężne, wieloplatformowe środowisko IDE. Nie jest dostarczany z własnym kompilatorem, więc musisz zainstalować osobny kompilator. W systemie Windows użyj np . MinGW .
  4. Wiele więcej
  5. Ponadto istnieje wiele kompilatorów online, takich jak http://ideone.com , https://www.onlinegdb.com/ i http://coliru.stacked-crooked.com/ , a także wiele innych (są to w większości dobre za wypróbowywanie pomysłów i pisanie bardzo małych programów).
  6. Zarówno Clang / LLVM, jak i GCC to bezpłatne kompilatory oprogramowania obsługujące najnowsze wersje C ++.

Niestety, niektóre szkoły / nauczyciele wydają się zmuszać uczniów do używania Turbo C ++ nawet w dzisiejszych czasach. Niestety nie jest to coś, co ta społeczność może naprawić. Jeśli znajdziesz się w takiej sytuacji, przygotuj się na brak możliwości uzyskania dużej pomocy z zewnątrz.

n. zaimki m.
źródło
7
@ Rakete1111 Myślę, że jest to bardziej w znaczeniu „Ten program nie zawiera żadnego problemu zgodnie z obecnym standardem”. To, czy jest to dobry styl programowania, to inna sprawa.
Hatted Rooster
21
@ Rakete1111 nie ma nic złego w odpowiedzialnym korzystaniu z using namespace std. Nauczenie nowych progamistów może być dobrą decyzją pedagogiczną lub nie, ale nie jest to moralnie złe samo w sobie.
n. zaimki m.
10
Zgadzam się, że using namespace stdto zła praktyka, ale myślę, że należy to do tego pytania, ponieważ programy C ++ hello world, które można znaleźć w Internecie, prawie zawsze to robią. Dlatego ważne jest, aby było jasne, że to nie jest powodem, dla którego Turbo C ++ jest nieszczęśliwe. Być może zamiast „Nie ma problemu z tym programem” powiedz „Ten program jest poprawny, zgodnie z obecnym standardem C ++; powinien się kompilować”.
zwol
5
@Puppy z tego samego powodu wszystkie wywołania standardowych funkcji są nieodpowiedzialne, ponieważ nie wiesz, jakie nowe przeciążenia zostaną dodane. Nie wiesz również, jakie funkcje językowe znikną z następnego standardu lub zmienią znaczenie. Nie wszystkie programy muszą istnieć przez dziesięciolecia lub być przenośne do dowolnych kompilatorów.
n. zaimki m.
6
„Niewiele osób pamięta Turbo C ++” Nie zgadzam się. Co najmniej jeden cały, duży kraj jest dziś aktywnie uczony .
Wyścigi lekkości na orbicie,
11

„Turbo C ++” może oznaczać wiele kompilatorów. Zadając to pytanie, ważne jest, aby podać numer wersji.

  • Borland Turbo C ++ do wersji 3.1 były czystymi kompilatorami MS DOS w klasycznym IDE z niebieskim tłem. Zostały one wydane mniej więcej między 1989 a 1992 rokiem, na długo przed ujednoliceniem C ++, co miało miejsce w 1998 roku. I dlatego używali przedstandardowego dialektu C ++.

    Przede wszystkim używali #include <iostream.h>raczej składni niż standardu #include <iostream>, ale nie obejmowali też wielu funkcji C ++, takich jak przestrzenie nazw, szablony itp. Biblioteka szablonów STL nie była jeszcze częścią standardu, więc wszystko związane z tą biblioteką było ładne różni się od tego, co później stało się standardem.

  • Później w latach 90-tych Borland wypuścił kilka kompilatorów DOS / Windows o lepszej zgodności. Aż do wersji 5 gdzieś nadal borykali się z pełną zgodnością z C ++ 98, chociaż te wersje Windows były dość bliskie.

  • Pod koniec lat 90. zrezygnowali z nazwy „Turbo C ++” na rzecz Borland C ++ Builder, który był nie tylko IDE, ale kompletnym narzędziem RAD opartym na Delphi. Te kompilatory były w pełni zgodne z C ++ 98 i późniejszym C ++ 03.

  • Około 2005 roku firma Borland porzuciła kompilatory jako część swojej linii produktów. Kompilatorami stał się „Codegear”, który później stał się Embarcadero. Gdzieś wtedy wydali darmową wersję Borland Builder, którą nazwali „Turbo C ++”. Ta wersja była w pełni zgodna z C ++ 03.

  • Obecnie te kompilatory nazywają się Embarcadero C ++ Builder. Myślę, że obecnie obsługują do C ++ 11 z niektórymi C ++ 14. Więcej informacji tutaj.

Nie trzeba dodawać, że jako student nie powinieneś używać niczego poza nowoczesnymi kompilatorami. Używanie kompilatorów MS DOS z 1991 roku podczas nauki C ++ w roku 2018 to po prostu szaleństwo. Nie tylko przynosi efekt przeciwny do zamierzonego, ale jest bezpośrednio szkodliwy i uczyni z Ciebie złego programistę C ++. Jeśli Twoja szkoła zmusza Cię do korzystania z Turbo C ++ 3.1 lub starszego, oznacza to, że jest zła, a nauczyciele są bardzo niekompetentni. Połącz ten post z nimi i ich dyrektorem.

Lundin
źródło
Turbo C ++ jest nadal powszechne w Indiach w 2020 roku . Więcej i więcej - „. To 40 lat przestarzałe kolegia Turbo C. Indian nadal uczyć się i odmawiają uczenia cokolwiek innego Dali mi zerowe ślady, bo użyłem std::stringzamiast char *w egzaminach, bo nie wiedzą, że C ++ jest znormalizowany i char *jest przestarzałe." .
Peter Mortensen
@PeterMortensen Tak ... jest trochę ok do nauczania C90 (co zabawne, wciąż jest w tym lepszy niż Visual Studio od 2020), ale dialekt C ++, którego używał, był po prostu szalony.
Lundin
7

Turbo C ++ jest bardzo starym kompilatorem i różni się nieco od kompilatora GNU C ++. Kod, który udostępniłeś, będzie działał doskonale z kompilatorem GNU, ale aby uruchomić go z Turbo C ++, musisz wprowadzić kilka zmian:

1. Zmień nazwę pliku nagłówkowego z iostreamna iostream.h
2. I usuń wiersz "using namespace std" To nie jest wymagane w Turbo C ++. Oto zmodyfikowany kod:

#include <iostream.h>

int main() 
{
  cout << "Hello, World!";
  return 0;
}
Yougansh Thakur
źródło
6
Co dodaje twoja odpowiedź, że zaakceptowany nie?
Rakete1111
7
streszczenie dla ludzi, którzy nie mają czasu na czytanie długich odpowiedzi.
Yougansh Thakur,
nie jest "trochę inny", ale bardzo różni się od kompilatorów C ++
phuclv