Por que um programa simples no estilo “Hello World” não compila com Turbo C ++?

101

Comecei a aprender C ++ para minha aula de programação. Baixei este programa "Hello World":

#include <iostream>
using namespace std;

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

mas Turbo C ++ reclama:

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'

O que há de errado com este programa tão simples? Como posso corrigir esses erros?

n. 'pronomes' m.
fonte
39
Pretende-se que seja um redirecionamento enganoso padrão para perguntas sobre problemas do Turbo C ++. Muitas dessas perguntas tendem a ser respondidas rapidamente com apenas uma breve explicação nos comentários, embora possam realmente usar uma resposta adequada. Melhorias são bem-vindas.
n. 'pronomes' m.
6
sugira mencionar qual versão do Turbo C ++ você está usando. A versão de 2006 lidou com este programa.
MM
5
"Comecei a aprender C ++ para minhas aulas de programação.". Isso é uma mentira. Período.
bugwheels94
5
@ bugwheels94 Veja isto .
n. 'pronomes' m.
5
@nm Eu não sei se bugwheells significava isso, mas eu os entendi como significando que se alguém aprender TurboC ++ (em particular, o antigo TurboC ++ que falha em compilar isso), então eles não estão aprendendo C ++ (que muitas pessoas, inclusive eu , implicitamente assume que significa C ++ padrão ).
eerorika 01 de

Respostas:

158

Não há problema com este programa. (Exceto provavelmente alguns problemas estilísticos - using namespace stdnão é recomendado). O problema é com o Turbo C ++. É um software muito antigo. Ele implementa um dialeto de C ++, o chamado pré-ANSI C ++ , que caiu completamente em desuso no início deste milênio. O primeiro padrão ANSI para C ++ foi publicado em 1998, depois houve a versão 2003, a versão 2011, a versão 2014, a versão 2017 e agora esperamos que a versão 2020 seja publicada oficialmente. Cada uma dessas revisões padrão trouxe mudanças mais ou menos significativas para o idioma.

Para Turbo C ++, você deve modificar o programa assim:

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

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

Se você olhar para este programa, a diferença entre o dialeto C ++ moderno e aquele aceito pelo Turbo C ++ pode parecer pequena. No entanto, ele se tornará muito maior à medida que seus programas ficarem mais complexos.

Embora você possa aprender a programar usando o Turbo C ++, recomendo fortemente que evite isso se for humanamente possível devido aos seguintes problemas:

  1. Você aprenderá um idioma que é um pouco semelhante a um idioma popular usado na indústria, mas é muito diferente, sem um bom motivo. Se você planeja escrever C ++ para o desenvolvimento de software real, terá que reaprender muito. É muito mais fácil aprender C ++ moderno imediatamente.
  2. Não existe literatura existente sobre o Turbo C ++. Quase 100% do material C ++ que você encontrará na Internet ou nos livros não é diretamente aplicável ao Turbo C ++ fora da caixa. Alguns precisarão apenas de pequenas adaptações, enquanto outros materiais são completamente inutilizáveis. Praticamente a única fonte de ajuda imediatamente disponível para você é a ajuda integrada do Turbo C ++.
  3. Poucas pessoas se lembram do Turbo C ++. Ao fazer perguntas em fóruns, sempre especifique que você está usando um dialeto pré-ANSI para filtrar as respostas voltadas para a versão moderna do idioma. Você provavelmente receberá um monte de comentários sugerindo que você pare imediatamente e mude para um compilador moderno a cada pergunta que fizer.

Existem muitos compiladores e IDEs gratuitos modernos (como na cerveja e também na fala ) que você pode usar no lugar do Turbo C ++. Alguns deles incluem:

  1. Visual C ++ Community Edition é um IDE e um compilador da Microsoft
  2. Code :: Blocks é um IDE leve. No Windows, ele vem com um compilador um pouco desatualizado, mas você mesmo pode instalar um compilador mais moderno
  3. Eclipse CDT é um poderoso IDE de plataforma cruzada. Ele não vem com seu próprio compilador, então você precisa instalar um compilador separado. No Windows, use, por exemplo, MinGW .
  4. Muito mais
  5. Além disso, existem muitos compiladores online, como http://ideone.com , https://www.onlinegdb.com/ e http://coliru.stacked-crooked.com/ , além de muitos mais (estes são geralmente bons para experimentar ideias e escrever programas muito pequenos).
  6. Ambos Clang / LLVM e GCC são compiladores de software livre com suporte a versões recentes de C ++.

Lamentavelmente, algumas escolas / professores parecem forçar os alunos a usar o Turbo C ++ mesmo hoje em dia. Infelizmente, isso não é algo que esta comunidade possa consertar. Se você se encontrar nessa situação, prepare-se para não conseguir obter muita ajuda externa.

n. 'pronomes' m.
fonte
7
@ Rakete1111 Acho que é mais no sentido de "Este programa não contém nenhum problema de acordo com o padrão atual." Se é um bom estilo de programação é outra coisa.
Sombrero Chicken
21
@ Rakete1111 não há nada de errado com o uso responsável de using namespace std. Pode ou não ser uma boa decisão pedagógica ensiná-lo a novos programadores, mas não é moralmente errado per se.
n. 'pronomes' m.
10
Eu concordo que using namespace stdé uma má prática, mas acho que pertence a esta questão, porque os programas C ++ hello world que você encontra online quase sempre fazem isso. Portanto, é importante deixar claro que não é isso que está deixando o Turbo C ++ infeliz. Talvez, em vez de "Não há problema com este programa", diga "Este programa é válido, de acordo com o padrão C ++ atual ; ele deve ser compilado."
zwol 01 de
5
@Puppy pelo mesmo token, todas as chamadas para funções padrão são irresponsáveis, porque você não sabe quais novas sobrecargas serão adicionadas. Você também não sabe quais recursos de idioma irão desaparecer do próximo padrão ou mudar de significado. Nem todos os programas precisam durar décadas ou ser portáveis ​​para compiladores arbitrários.
n. 'pronomes' m.
6
"Poucas pessoas se lembram do Turbo C ++" Eu discordo. Pelo menos um grande país inteiro está sendo ensinado ativamente hoje .
Lightness Races in Orbit
11

"Turbo C ++" pode significar vários compiladores. Ao fazer esta pergunta, é importante incluir o número da versão.

  • Borland Turbo C ++ até a versão 3.1 eram compiladores MS DOS puros no IDE clássico de fundo azul. Eles foram lançados em algum lugar entre 1989 e 1992, muito antes do C ++ se tornar padronizado, o que aconteceu no ano de 1998. E então eles usaram um dialeto pré-padrão do C ++.

    Mais notavelmente, eles usaram a #include <iostream.h>sintaxe em vez do padrão #include <iostream>, mas também não cobriram muitos recursos C ++ como namespaces, modelos etc. A biblioteca de modelos STL ainda não fazia parte do padrão, então tudo relacionado a essa biblioteca era bonito diferente do que mais tarde se tornou padrão.

  • Mais tarde, na década de 90, a Borland lançou vários compiladores DOS / Windows com melhor conformidade. Em algum lugar, até a versão 5, eles ainda lutavam para cumprir totalmente a conformidade com o C ++ 98, embora essas versões do Windows estivessem bem próximas disso.

  • No final dos anos 90, eles abandonaram o nome "Turbo C ++" em favor do Borland C ++ Builder, que não era apenas um IDE, mas uma ferramenta RAD completa baseada em Delphi. Esses compiladores eram totalmente compatíveis com C ++ 98 e C ++ 03 posterior.

  • Por volta de 2005, a Borland abandonou os compiladores como parte de sua linha de produtos. Os compiladores se tornaram "Codegear", que mais tarde se tornou Embarcadero. Em algum momento, eles lançaram uma versão gratuita do Borland Builder que chamaram de "Turbo C ++". Esta versão estava totalmente em conformidade com C ++ 03.

  • Hoje em dia, esses compiladores são chamados de Embarcadero C ++ Builder. Acredito que atualmente eles suportam até C ++ 11 com alguns C ++ 14. Mais informações aqui.

Nem é preciso dizer que, como estudante, você não deve usar nada além de compiladores modernos. Usar compiladores MS DOS de 1991 ao aprender C ++ no ano de 2018 é simplesmente uma loucura. Além de ser contraproducente, é diretamente prejudicial e tornará você um péssimo programador de C ++. Se sua escola está forçando você a usar o Turbo C ++ 3.1 ou mais antigo, então sua escola é ruim e seus professores são extremamente incompetentes. Por favor, link esta postagem para eles e seu diretor.

Lundin
fonte
O Turbo C ++ ainda é comum na Índia em 2020 . Cada vez mais - "As faculdades indianas Turbo C. ultrapassadas de 40 anos ainda ensinam e se recusam a ensinar qualquer outra coisa. Eles me deram zero nota, porque eu usei em std::stringvez de char *nos exames, porque eles não sabem que C ++ é padronizado e char *está obsoleto. " .
Peter Mortensen
@PeterMortensen Sim ... é um pouco ok para ensinar C90 (engraçado, ainda é melhor nisso do que o Visual Studio de 2020), mas o dialeto C ++ que ele usava era simplesmente confuso.
Lundin
7

Turbo C ++ é um compilador muito antigo e um pouco diferente do compilador GNU C ++. O código que você compartilhou funcionará perfeitamente com o compilador GNU, mas para executá-lo com Turbo C ++ você precisa fazer algumas alterações:

1. Altere o nome do arquivo de cabeçalho de iostreampara iostream.h
2. E remova a linha "using namespace std" Não é exigido no Turbo C ++. Aqui está o código modificado:

#include <iostream.h>

int main() 
{
  cout << "Hello, World!";
  return 0;
}
Yougansh Thakur
fonte
6
O que sua resposta acrescenta que a aceita não?
Rakete1111
7
essência para as pessoas que não têm tempo para ler respostas longas.
Yougansh Thakur
não é "um pouco diferente", mas muito diferente dos compiladores C ++
phuclv