Tại sao một chương trình đơn giản kiểu “Hello World” không biên dịch bằng Turbo C ++?


101

Tôi đã bắt đầu học C ++ cho lớp lập trình của mình. Tôi đã tải xuống chương trình "Hello World" này:

#include <iostream>
using namespace std;

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

nhưng Turbo C ++ phàn nàn:

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'

Có gì sai với chương trình rất đơn giản này? Làm cách nào để sửa những lỗi này?


39
Điều này nhằm mục đích là một chuyển hướng dupe tiêu chuẩn cho các câu hỏi hỏi về sự cố Turbo C ++. Nhiều câu hỏi trong số này có xu hướng bị loại bỏ nhanh chóng chỉ với một lời giải thích ngắn gọn trong phần bình luận, trong khi chúng thực sự có thể sử dụng một câu trả lời thích hợp. Cải tiến được hoan nghênh.
n. 'đại từ' m.

6
đề nghị đề cập đến phiên bản Turbo C ++ mà bạn đang sử dụng. Phiên bản năm 2006 đã đối phó với chương trình này.
MM

5
"Tôi đã bắt đầu học C ++ cho lớp lập trình của mình.". Đây là một lời nói dối. Giai đoạn = Stage.
bugwheels94

5
@ bugwheels94 Xem này .
n. 'đại từ' m.

5
@nm Tôi không biết bugwheells có nghĩa là như vậy không, nhưng tôi hiểu chúng có nghĩa là nếu một người được dạy TurboC ++ (cụ thể là TurboC ++ cũ không biên dịch được điều này), thì họ không học C ++ (mà nhiều người, tôi bao gồm , ngầm định nghĩa là C ++ chuẩn ).
eerorika

Câu trả lời:


158

Không có vấn đề với chương trình này. (Có lẽ ngoại trừ một số vấn đề về phong cách - using namespace stdkhông được khuyến khích). Vấn đề là với Turbo C ++. Nó là một phần mềm rất cũ. Nó triển khai một phương ngữ của C ++, được gọi là C ++ tiền ANSI , đã hoàn toàn không còn được sử dụng vào đầu thiên niên kỷ này. Tiêu chuẩn ANSI đầu tiên cho C ++ được xuất bản vào năm 1998, sau đó có phiên bản 2003, phiên bản 2011, phiên bản 2014, phiên bản 2017 và hiện tại chúng tôi dự kiến ​​phiên bản 2020 sẽ được xuất bản chính thức. Mỗi bản sửa đổi tiêu chuẩn này đã ít nhiều mang lại những thay đổi đáng kể cho ngôn ngữ.

Đối với Turbo C ++, bạn phải sửa đổi chương trình như sau:

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

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

Nếu bạn nhìn vào chương trình này, sự khác biệt giữa phương ngữ C ++ hiện đại và phương ngữ được Turbo C ++ chấp nhận có vẻ nhỏ. Tuy nhiên, nó sẽ lớn hơn nhiều vì các chương trình của bạn sẽ ngày càng phức tạp hơn.

Trong khi bạn có thể học lập trình bằng Turbo C ++, tôi thực sự khuyên bạn nên tránh điều đó nếu có thể vì những vấn đề sau:

  1. Bạn sẽ học một ngôn ngữ hơi giống với một ngôn ngữ phổ biến được sử dụng trong ngành, nhưng rất khác biệt, không vì lý do chính đáng. Nếu bạn định viết C ++ để phát triển phần mềm thực sự, bạn sẽ phải học lại nhiều. Việc học C ++ hiện đại ngay lập tức sẽ dễ dàng hơn nhiều.
  2. Không có tài liệu nào còn tồn tại về Turbo C ++. Gần 100% tài liệu C ++ bạn sẽ tìm thấy trên internet hoặc trong sách không áp dụng trực tiếp cho Turbo C ++. Một số sẽ chỉ cần thích ứng nhỏ, trong khi các vật liệu khác hoàn toàn không sử dụng được. Khá nhiều nguồn trợ giúp duy nhất có sẵn ngay lập tức cho bạn là trợ giúp Turbo C ++ tích hợp sẵn.
  3. Ít người nhớ đến Turbo C ++. Khi đặt câu hỏi trên các diễn đàn, hãy luôn nêu rõ rằng bạn đang sử dụng phương ngữ trước ANSI để lọc ra các câu trả lời hướng tới phiên bản hiện đại của ngôn ngữ. Bạn có thể sẽ nhận được một loạt các bình luận đề nghị bạn dừng lại ngay lập tức và chuyển sang một trình biên dịch hiện đại với mọi câu hỏi bạn đặt ra.

Có rất nhiều trình biên dịch và IDE miễn phí hiện đại (như trong bia , cũng như trong lời nói ) mà bạn có thể sử dụng thay cho Turbo C ++. Một số trong số này bao gồm:

  1. Visual C ++ Community Edition là một IDE và một trình biên dịch của Microsoft
  2. Code :: Blocks là một IDE nhẹ. Trên Windows, nó có trình biên dịch hơi lỗi thời, nhưng bạn có thể tự cài đặt trình biên dịch hiện đại hơn
  3. Eclipse CDT là một IDE đa nền tảng mạnh mẽ. Nó không có trình biên dịch riêng nên bạn cần phải cài đặt trình biên dịch riêng. Trên Windows, sử dụng ví dụ: MinGW .
  4. Nhiều nữa
  5. Ngoài ra, có rất nhiều trình biên dịch trực tuyến như http://ideone.com , https://www.onlinegdb.com/http://coliru.stacked-crooked.com/ , cộng với nhiều trình biên dịch khác (hầu hết đều tốt để thử các ý tưởng và viết các chương trình rất nhỏ).
  6. Cả Clang / LLVMGCC đều là những trình biên dịch phần mềm miễn phí hỗ trợ các phiên bản gần đây của C ++.

Thật không may, một số trường học / giáo viên xuất hiện ép buộc học sinh sử dụng Turbo C ++ ngay cả trong thời đại ngày nay. Rất tiếc, đây không phải là điều mà cộng đồng này có thể sửa chữa. Nếu bạn thấy mình trong tình huống này, hãy chuẩn bị để không thể nhận được nhiều sự trợ giúp từ bên ngoài.


7
@ Rakete1111 Tôi nghĩ nó theo nghĩa "Chương trình này không có vấn đề gì theo tiêu chuẩn hiện tại." Cho dù đó là phong cách lập trình tốt là một điều khác.
Sombrero Chicken

21
@ Rakete1111 không có gì sai khi sử dụng có trách nhiệmusing namespace std . Có thể có hoặc có thể không phải là một quyết định sư phạm tốt khi dạy nó cho những người mới lập nghiệp, nhưng nó không sai về mặt đạo đức.
n. 'đại từ' m.

10
Tôi đồng ý rằng đó using namespace stdlà cách làm không tốt, nhưng tôi nghĩ câu hỏi này thuộc về câu hỏi này, vì các chương trình C ++ hello world bạn tìm thấy trên mạng hầu như luôn làm được điều đó. Vì vậy, điều quan trọng là phải rõ ràng rằng đó không phải là điều khiến Turbo C ++ không hài lòng. Có lẽ thay vì "Không có vấn đề gì với chương trình này", hãy nói "Chương trình này hợp lệ, theo tiêu chuẩn C ++ hiện tại ; nó nên được biên dịch."
zwol

5
@Puppy cùng một mã thông báo, tất cả các lệnh gọi đến các hàm tiêu chuẩn là vô trách nhiệm, bởi vì bạn không biết những quá tải mới nào sẽ được thêm vào. Bạn cũng không biết những tính năng ngôn ngữ nào sẽ biến mất khỏi tiêu chuẩn tiếp theo hoặc thay đổi ý nghĩa. Không phải tất cả các chương trình cần phải tồn tại trong nhiều thập kỷ hoặc có thể di động đến các trình biên dịch tùy ý.
n. 'đại từ' m.

6
"Ít người nhớ đến Turbo C ++" Tôi không đồng ý. Ít nhất một toàn bộ đất nước rộng lớn đang được tích cực dạy nó ngày nay .
Các cuộc đua ánh sáng trong quỹ đạo vào

11

"Turbo C ++" có thể có nghĩa là nhiều trình biên dịch. Khi hỏi câu hỏi này, điều quan trọng là phải bao gồm số phiên bản.

  • Borland Turbo C ++ lên đến phiên bản 3.1 là trình biên dịch MS DOS thuần túy trên nền IDE màu xanh cổ điển. Chúng được phát hành khoảng từ năm 1989 đến năm 1992, rất lâu trước khi C ++ được chuẩn hóa, điều này xảy ra vào năm 1998. Và vì vậy chúng đã sử dụng phương ngữ trước chuẩn của C ++.

    Đáng chú ý nhất là họ sử dụng #include <iostream.h>cú pháp chứ không phải tiêu chuẩn #include <iostream>, nhưng cũng không bao gồm toàn bộ các tính năng của C ++ như không gian tên, mẫu, v.v. Thư viện mẫu STL chưa phải là một phần của tiêu chuẩn, vì vậy mọi thứ liên quan đến thư viện đó đều khá khác với những gì sau này trở thành tiêu chuẩn.

  • Cuối những năm 90, Borland đã phát hành một số trình biên dịch DOS / Windows với sự tuân thủ tốt hơn. Lên đến phiên bản 5 ở đâu đó họ vẫn phải vật lộn để tuân thủ hoàn toàn C ++ 98, mặc dù các phiên bản Windows này khá gần với nó.

  • Vào cuối những năm 90, họ bỏ tên "Turbo C ++" để ưu tiên cho Borland C ++ Builder, nó không chỉ là một IDE mà là một công cụ RAD hoàn chỉnh dựa trên Delphi. Các trình biên dịch này hoàn toàn tuân thủ C ++ 98 và sau đó là C ++ 03.

  • Khoảng năm 2005, Borland đã bỏ trình biên dịch như một phần của dòng sản phẩm của họ. Các trình biên dịch trở thành "Codegear", sau này trở thành Embarcadero. Ở đâu đó xung quanh đó, họ đã phát hành một phiên bản miễn phí của Borland Builder mà họ đặt tên là "Turbo C ++". Phiên bản này hoàn toàn phù hợp với C ++ 03.

  • Ngày nay những trình biên dịch này được gọi là Embarcadero C ++ Builder. Tôi tin rằng họ hiện hỗ trợ tối đa C ++ 11 với một số C ++ 14. Thêm thông tin ở đây.

Không cần phải nói, là một sinh viên, bạn không nên sử dụng bất cứ thứ gì ngoài các trình biên dịch hiện đại. Sử dụng trình biên dịch MS DOS từ năm 1991 khi học C ++ vào năm 2018 chỉ đơn giản là điên rồ. Nó không chỉ phản tác dụng mà còn có hại trực tiếp và khiến bạn trở thành một lập trình viên C ++ tồi. Nếu trường học của bạn buộc bạn phải sử dụng Turbo C ++ 3.1 trở lên, thì trường của bạn tồi và giáo viên của bạn không đủ năng lực. Vui lòng liên kết bài đăng này với họ và hiệu trưởng của họ.


Turbo C ++ vẫn còn phổ biến ở Ấn Độ vào năm 2020 . Nhiều hơnnhiều hơn nữa - . "Đó là 40 tuổi lạc hậu trường cao đẳng Turbo C. Ấn Độ vẫn dạy nó và rác để dạy bất cứ điều gì khác Họ đã cho tôi không nhãn hiệu, bởi vì tôi đã sử dụng std::stringthay vì char *trong các kỳ thi, bởi vì họ không biết rằng C ++ được tiêu chuẩn hóa và char *không được dùng nữa. " .
Peter Mortensen

@PeterMortensen Vâng ... nó có phần ổn khi dạy C90 (thú vị là nó vẫn tốt hơn Visual Studio từ năm 2020), nhưng phương ngữ C ++ mà nó sử dụng chỉ là haywire.
Lundin

7

Turbo C ++ là một trình biên dịch rất cũ và nó hơi khác một chút so với trình biên dịch GNU C ++. Mã bạn đã chia sẻ sẽ hoạt động hoàn hảo với trình biên dịch GNU nhưng để chạy nó với Turbo C ++, bạn cần thực hiện một số thay đổi:

1. Thay đổi tên của tệp tiêu đề từ iostreamthành iostream.h
2. Và loại bỏ dòng "using namespace std". yêu cầu trong Turbo C ++. Đây là mã đã sửa đổi:

#include <iostream.h>

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

6
Câu trả lời của bạn bổ sung điều gì mà câu trả lời được chấp nhận thì không?
Rakete1111

7
ý chính cho những người không có thời gian đọc các câu trả lời dài.
Yougansh Thakur

nó không phải là "một chút cắn khác nhau" nhưng rất khác nhau từ C ++ biên dịch
phuclv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.