เหตุใดโปรแกรมสไตล์“ 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


5
@nm ฉันไม่รู้ว่า bugwheells หมายถึงสิ่งนี้หรือเปล่า แต่ฉันเอามันไปหมายความว่าถ้ามีคนสอนTurboC ++ (โดยเฉพาะ TurboC ++ เก่าที่รวบรวมสิ่งนี้ไม่ได้) แสดงว่าพวกเขาไม่ได้เรียนรู้C ++ (ซึ่งหลายคนรวมฉันไว้ด้วย โดยปริยายถือว่าหมายถึงC ++ มาตรฐาน )
eerorika

คำตอบ:


158

ไม่มีปัญหากับโปรแกรมนี้ (ยกเว้นอาจมีปัญหาเกี่ยวกับโวหาร - using namespace stdไม่แนะนำ) ปัญหาอยู่ที่ Turbo C ++ มันเป็นซอฟต์แวร์ชิ้นเก่ามาก มันใช้ภาษา C ++ ที่เรียกว่าpre-ANSI C ++ซึ่งไม่สามารถใช้งานได้อย่างสมบูรณ์ภายในต้นสหัสวรรษนี้ มาตรฐาน ANSI แรกสำหรับ C ++ ได้รับการเผยแพร่ในปี 2541 จากนั้นก็มีเวอร์ชัน 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 ++ ที่ยังหลงเหลืออยู่ เนื้อหา C ++ เกือบ 100% ที่คุณจะพบบนอินเทอร์เน็ตหรือในหนังสือไม่สามารถใช้ได้โดยตรงกับ 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 ฉันคิดว่าในแง่ของ "โปรแกรมนี้ไม่มีปัญหาต่อมาตรฐานปัจจุบัน" ไม่ว่าจะเป็นรูปแบบการเขียนโปรแกรมที่ดีก็เป็นอีกสิ่งหนึ่ง
Sombrero Chicken

21
@ Rakete1111 มีอะไรผิดปกติกับความรับผิดชอบในusing namespace stdการใช้งานของ อาจเป็นการตัดสินใจที่ดีในการสอนหรือไม่ก็ได้ที่จะสอนให้กับผู้เริ่มต้นใหม่ แต่ก็ไม่ผิดศีลธรรมต่อตัวเอง
. 'สรรพนาม' ม.

10
ฉันยอมรับว่าusing namespace stdเป็นการปฏิบัติที่ไม่ดี แต่ฉันคิดว่ามันเป็นคำถามนี้เพราะโปรแกรม C ++ hello world ที่คุณพบทางออนไลน์มักจะทำ ดังนั้นสิ่งสำคัญคือต้องชัดเจนว่านั่นไม่ใช่สิ่งที่ทำให้ Turbo C ++ ไม่พอใจ บางทีแทนที่จะพูดว่า "ไม่มีปัญหากับโปรแกรมนี้" "โปรแกรมนี้ถูกต้องตามมาตรฐาน C ++ ปัจจุบันควรคอมไพล์"
zwol

5
@Puppy ด้วยโทเค็นเดียวกันการเรียกใช้ฟังก์ชันมาตรฐานทั้งหมดจะไม่รับผิดชอบเนื่องจากคุณไม่รู้ว่าจะมีการเพิ่มโอเวอร์โหลดใหม่ใด คุณยังไม่รู้ด้วยว่าคุณลักษณะของภาษาใดจะหายไปจากมาตรฐานถัดไปหรือเปลี่ยนความหมาย โปรแกรมบางโปรแกรมไม่จำเป็นต้องใช้งานได้นานหลายทศวรรษหรือพกพาไปยังคอมไพเลอร์ได้
. 'สรรพนาม' ม.

6
"ไม่กี่คนที่จำ Turbo C ++"ฉันไม่เห็นด้วย อย่างน้อยหนึ่งคนทั้งประเทศที่มีขนาดใหญ่จะถูกแข็งขันสอนในวันนี้
Lightness Races ใน Orbit

11

"Turbo C ++" อาจหมายถึงคอมไพเลอร์จำนวนมาก เมื่อถามคำถามนี้สิ่งสำคัญคือต้องใส่หมายเลขเวอร์ชัน

  • Borland Turbo C ++ จนถึงเวอร์ชัน 3.1 เป็นคอมไพเลอร์ MS DOS ที่บริสุทธิ์ใน IDE พื้นหลังสีน้ำเงินคลาสสิก สิ่งเหล่านี้ถูกปล่อยออกมาในช่วงระหว่างปี 1989 ถึง 1992 นานก่อนที่ C ++ จะกลายเป็นมาตรฐานซึ่งเกิดขึ้นในปี 1998 ดังนั้นพวกเขาจึงใช้ภาษา C ++ ก่อนมาตรฐาน

    โดยเฉพาะอย่างยิ่งพวกเขาใช้#include <iostream.h>ไวยากรณ์มากกว่ามาตรฐาน#include <iostream>แต่ยังไม่ครอบคลุมคุณสมบัติ C ++ จำนวนมากเช่นเนมสเปซเทมเพลตเป็นต้นไลบรารีเทมเพลต STL ยังไม่ได้เป็นส่วนหนึ่งของมาตรฐานดังนั้นทุกอย่างที่เกี่ยวข้องกับไลบรารีนั้นจึงค่อนข้างสวย แตกต่างจากสิ่งที่กลายเป็นมาตรฐานในภายหลัง

  • ต่อมาในยุค 90 บอร์แลนด์ได้เปิดตัวคอมไพเลอร์ DOS / Windows หลายตัวที่มีความสอดคล้องกันดีกว่า จนถึงเวอร์ชัน 5 บางแห่งที่พวกเขายังคงต่อสู้กับความสอดคล้องกับ C ++ 98 อย่างสมบูรณ์แม้ว่าเวอร์ชัน Windows เหล่านี้จะค่อนข้างใกล้เคียงก็ตาม

  • ในช่วงปลายยุค 90 พวกเขาได้ทิ้งชื่อ "Turbo C ++" ลงใน Borland C ++ Builder ซึ่งไม่ใช่แค่ IDE แต่เป็นเครื่องมือ RAD ที่สมบูรณ์โดยใช้ Delphi คอมไพเลอร์เหล่านี้สอดคล้องกับ C ++ 98 และ C ++ 03 ที่ใหม่กว่า

  • ประมาณปี 2548 บอร์แลนด์ทิ้งคอมไพเลอร์ซึ่งเป็นส่วนหนึ่งของสายผลิตภัณฑ์ คอมไพเลอร์กลายเป็น "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 ปีเก่าวิทยาลัยเทอร์โบซีอินเดียยังคงสอนและปฏิเสธที่จะอะไรสอนอื่นพวกเขาให้ฉันเครื่องหมายศูนย์เพราะผมใช้std::stringแทนchar *ในการสอบเพราะพวกเขาไม่ทราบว่า C ++ เป็นมาตรฐานและchar *เลิกใช้งานแล้ว " .
Peter Mortensen

@PeterMortensen ใช่ ... มันค่อนข้างโอเคสำหรับการสอน C90 (น่าขบขัน แต่ก็ยังดีกว่า Visual Studio ในปี 2020) แต่ภาษา C ++ ที่ใช้นั้นเป็นเพียงความยุ่งเหยิง
Lundin

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.