กลับไปหน้าบทความ

อ่าน 20 นาที

ซี++

เปลี่ยนเส้นทางไปยังส่วนต่างๆ

C++ เป็น ภาษาโปรแกรม ระดับสูงอเนกประสงค์ที่สร้างขึ้นโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวเดนมาร์กBjarne Stroustrupเปิดตัวครั้งแรกในปี 1985 ในฐานะส่วนขยายของภาษาโปรแกรม Cโดยเพิ่ม...

ซี++

ซี++
โลโก้ได้รับการรับรองจากคณะกรรมการมาตรฐาน C++
กระบวนทัศน์หลายกระบวนทัศน์ : ขั้นตอน , คำสั่ง , ฟังก์ชัน , เชิงวัตถุ , ทั่วไป , โมดูลาร์ , การสะท้อน[ 1 ] การ ออกแบบตามสัญญา
ตระกูลซี
ออกแบบ โดยบียาร์เน สโตรสตรุป
นักพัฒนาISO/IEC JTC 1 (คณะกรรมการเทคนิคร่วม 1) / SC 22 (คณะอนุกรรมการ 22) / WG 21 (กลุ่มงาน 21)
 ปรากฏครั้งแรก1985  ( 1985 )
เวอร์ชันเสถียร
C++23 (ISO/IEC 14882:2024) / 19  ตุลาคม 2024  ( 2024-10-19 )
รุ่นทดลองใช้งาน
C++26 (N5032) [ 2 ] / 15  ธันวาคม 2025  ( 2025-12-15 )
วินัยในการพิมพ์คงที่แข็งแกร่งนามนัยอนุมานได้บางส่วน
โอเอสข้ามแพลตฟอร์ม
นามสกุลไฟล์.C, .cc, .cpp, .cxx, .c++ , .h, .H, .hh, .hpp, .hxx, .h++ .cppm, .ixx [ 3 ]
เว็บไซต์isocpp.org
การนำไปใช้งานหลักๆ
GCC , LLVM Clang , Microsoft Visual C++ , Embarcadero C++Builder , Intel C++ Compiler , IBM XL C++ , EDG
ได้รับอิทธิพลจาก
Ada , ALGOL 68 , [ 4 ] BCPL , [ 5 ] C , CLU , [ 4 ] F# , [ 6 ] [ a ] ​​ML , Mesa , [ 4 ] Modula-2 , [ 4 ] Simula , Smalltalk [ 4 ]
ได้รับอิทธิพล
Ada 95 , C# , [ 7 ] C99 , Carbon , Chapel , [ 8 ] Clojure , [ 9 ] D , Java , [ 10 ] JS++ , [ 11 ] Lua , [ 12 ] Nim , [ 13 ] Objective-C++ , Perl , PHP , Python , [ 14 ] Rust [ 15 ]

C++ [ b ]เป็น ภาษาโปรแกรม ระดับสูงอเนกประสงค์ที่สร้างขึ้นโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวเดนมาร์กBjarne Stroustrupเปิดตัวครั้งแรกในปี 1985 ในฐานะส่วนขยายของภาษาโปรแกรม Cโดยเพิ่ม คุณสมบัติ เชิงวัตถุ (OOP) และต่อมาได้ขยายตัวอย่างมากเมื่อเวลาผ่านไป โดยเพิ่มคุณสมบัติ OOP และคุณสมบัติอื่นๆ เพิ่มเติมณ ปี 1997/การกำหนดมาตรฐาน C++98 ทำให้ C++ เพิ่ม คุณสมบัติ เชิงฟังก์ชันนอกเหนือจากสิ่งอำนวยความสะดวกสำหรับ การจัดการ หน่วยความจำระดับต่ำ สำหรับระบบต่างๆ เช่นไมโครคอมพิวเตอร์หรือเพื่อสร้างระบบปฏิบัติการ เช่นLinuxหรือWindowsและต่อมาก็มีคุณสมบัติเช่นการเขียนโปรแกรมแบบเจเนริก (ผ่านการใช้เทมเพลต ) C++ มักถูกนำไปใช้เป็นภาษาคอมไพล์และผู้จำหน่ายหลายรายให้ บริการคอมไพ เลอร์ C++รวมถึงFree Software Foundation , LLVM , Microsoft , Intel , Embarcadero , OracleและIBM [ 16 ]

C++ ได้รับการออกแบบโดยคำนึงถึงการเขียนโปรแกรมระบบและซอฟต์แวร์ฝังตัวที่ มีทรัพยากรจำกัดและระบบขนาดใหญ่ โดยเน้น ประสิทธิภาพประสิทธิผล และความยืดหยุ่นในการใช้งานเป็นจุดเด่นในการออกแบบ[ 17 ]นอกจากนี้ C++ ยังพบว่ามีประโยชน์ในบริบทอื่นๆ อีกมากมาย โดยมีจุดแข็งที่สำคัญคือโครงสร้างพื้นฐานซอฟต์แวร์และแอปพลิเคชันที่มีทรัพยากรจำกัด[ 17 ]รวมถึงแอปพลิเคชันเดสก์ท็อป วิดีโอเกมเซิร์ฟเวอร์(เช่นอีคอมเมิร์ซการค้นหาเว็บหรือฐานข้อมูล ) และแอปพลิเคชันที่สำคัญต่อประสิทธิภาพ (เช่นสวิตช์โทรศัพท์หรือยานสำรวจอวกาศ ) [ 18 ]

C++ ได้รับการกำหนดมาตรฐานโดยองค์การมาตรฐานสากล (ISO) โดยมาตรฐานเวอร์ชันล่าสุดได้รับการรับรองและเผยแพร่โดย ISO ในเดือนตุลาคม 2024 ในชื่อISO/IEC 14882:2024 (เรียกอย่างไม่เป็นทางการว่าC++23 ) [ 19 ]ภาษาโปรแกรม C++ ได้รับการกำหนดมาตรฐานครั้งแรกในปี 1998 ในชื่อISO/IEC 14882:1998ซึ่งต่อมาได้รับการแก้ไขโดย มาตรฐาน C++03 , C++11 , C++14 , C++17และC++20 มาตรฐาน C++23ต่อมาได้เข้ามาแทนที่มาตรฐานเหล่านี้ด้วยคุณสมบัติใหม่และไลบรารีมาตรฐาน ที่ขยายใหญ่ขึ้น ก่อนการกำหนดมาตรฐานครั้งแรกในปี 1998 C++ ได้รับการพัฒนาโดย Stroustrup ที่Bell Labsตั้งแต่ปี 1979 ในฐานะส่วนขยายของภาษา C เขาต้องการภาษาที่มีประสิทธิภาพและยืดหยุ่นคล้ายกับ C ที่มีคุณสมบัติระดับสูงสำหรับการจัดระเบียบโปรแกรม ด้วย [ 20 ]ตั้งแต่ปี 2012 C++ มีกำหนดการออกเวอร์ชันใหม่ทุกสามปี[ 21 ]โดยมีC++29เป็นมาตรฐานถัดไปที่วางแผนไว้[ 22 ]

ประวัติศาสตร์

บียาร์เน สโตรสทรุปผู้สร้างภาษา C++ ในสำนักงาน AT&T รัฐนิวเจอร์ซีย์ประมาณปี 2000

ในปี 1979 บียาร์เน สโตรสตรุปนักวิทยาศาสตร์คอมพิวเตอร์ชาวเดนมาร์กเริ่มทำงานเกี่ยวกับ "C ที่มีคลาสซึ่งเป็นภาษาต้นแบบของ C++ [ 23 ]แรงจูงใจในการสร้างภาษาใหม่นี้มาจากประสบการณ์การเขียนโปรแกรมของ Stroustrup สำหรับวิทยานิพนธ์ปริญญาเอกของเขา Stroustrup พบว่า Simulaมีคุณสมบัติที่เป็นประโยชน์อย่างมากสำหรับการพัฒนาซอฟต์แวร์ขนาดใหญ่ แต่ภาษานี้ช้าเกินไปสำหรับการใช้งานจริง ในขณะที่ BCPLนั้นเร็วแต่ระดับต่ำเกินไปที่จะเหมาะสำหรับการพัฒนาซอฟต์แวร์ขนาดใหญ่ เมื่อ Stroustrup เริ่มทำงานที่ AT&T Bell Labsเขาประสบปัญหาในการวิเคราะห์เคอร์เนลUNIX ที่เกี่ยวข้องกับการประมวลผลแบบกระจายเมื่อนึกถึงประสบการณ์ปริญญาเอกของเขา Stroustrup จึงเริ่มพัฒนา ภาษา Cด้วยคุณสมบัติที่คล้ายกับ Simula [ 24 ]เลือก C เพราะเป็นภาษาอเนกประสงค์ รวดเร็ว พกพาได้ และใช้งานกันอย่างแพร่หลาย นอกจากอิทธิพลของ C และ Simula แล้ว ภาษาอื่นๆ ก็มีอิทธิพลต่อภาษาใหม่นี้ด้วย ได้แก่ ALGOL 68 , Ada , CLUและ ML [ 25 ]

ในขั้นต้น "C with Classes" ของ Stroustrup ได้เพิ่มคุณสมบัติให้กับคอมไพเลอร์ Cpre รวมถึงคลาสคลาสที่สืบทอด การกำหนดประเภท ที่เข้มงวดการอินไลน์และอาร์กิวเมนต์เริ่มต้น[ 26 ]

มีการจัดสอบวัดความรู้เกี่ยวกับคุณสมบัติของ C++11 ที่ปารีสในปี 2015

ในปี พ.ศ. 2525 Stroustrup เริ่มออกแบบภาษา C เวอร์ชันปรับปรุงและขยายเพิ่มเติมโดยใช้คลาส โดยใช้เทคโนโลยีคอมไพเลอร์แบบดั้งเดิม[ 27 ]ภาษานี้ถูกเรียกว่า C84 ชั่วคราวก่อนที่จะใช้ชื่อ C++ ซึ่งชื่อนี้ได้รับการแนะนำโดย Rick Mascitti และหมายถึง++ตัวดำเนินการเพิ่มค่า ของ ภาษา C [ 27 ] [ 28 ]ภาษาที่ได้นั้นประกอบด้วยฟังก์ชันเสมือนการโอเวอร์โหลดฟังก์ชันและ ตัวดำเนินการ การอ้างอิงการตรวจสอบประเภทconstที่ดีขึ้นการจัดสรรหน่วยความจำแบบฟรีสโตร์ที่ผู้ใช้ควบคุมได้ ( / ) และความคิดเห็น แบบบรรทัดเดียวสไตล์ BCPL [ 27 ] Stroustrup ยังออกแบบและใช้งานCfront ซึ่งเป็นส่วนหน้าของคอมไพเลอร์ C++ ระหว่างฤดูใบไม้ผลิปี พ.ศ. 2525 ถึงฤดูร้อนปี พ.ศ. 2526 [ 27 ]newdelete//

ในปี พ.ศ. 2527 Stroustrup ได้นำไลบรารีอินพุต/เอาต์พุตสตรีมตัวแรกมาใช้ แนวคิดในการจัดเตรียมตัวดำเนินการเอาต์พุตแทนที่จะเป็นฟังก์ชันเอาต์พุตที่มีชื่อนั้นได้รับการเสนอแนะโดยDoug McIlroy [ 4 ] (ซึ่งก่อนหน้านี้ได้เสนอแนะท่อ Unix )

ในปี พ.ศ. 2528 หนังสือThe C++ Programming Language ฉบับพิมพ์ครั้งแรก ได้รับการเผยแพร่ ซึ่งกลายเป็นหนังสืออ้างอิงที่สำคัญสำหรับภาษานี้ เนื่องจากยังไม่มีมาตรฐานอย่างเป็นทางการ[ 29 ]การใช้งานเชิงพาณิชย์ครั้งแรกของ C++ ได้รับการเผยแพร่ในเดือนตุลาคมของปีเดียวกัน[ 23 ]

ในปี พ.ศ. 2532 C++ 2.0 ได้ถูกเผยแพร่ ตามมาด้วยฉบับปรับปรุงครั้งที่สองของThe C++ Programming Languageในปี พ.ศ. 2534 [ 30 ]คุณสมบัติใหม่ในเวอร์ชัน 2.0 ได้แก่ การสืบทอดแบบหลายทาง คลาสแบบนามธรรม ฟังก์ชันสมาชิกแบบคงที่ ฟังก์ชันสมาชิกแบบคงที่และสมาชิกแบบป้องกัน ในปี พ.ศ. 2533 ได้มีการตีพิมพ์ The Annotated C++ Reference Manual ซึ่งงานนี้ได้กลายเป็นพื้นฐานสำหรับมาตรฐานในอนาคต คุณสมบัติเพิ่มเติมในภายหลัง ได้แก่เทมเพลตข้อยกเว้นเนมสเปซการแปลงประเภทใหม่และประเภทบูลี

ในปี 1998 C++98 ได้ถูกปล่อยออกมา ซึ่งเป็นการกำหนดมาตรฐานของภาษา และมีการอัปเดตเล็กน้อย ( C++03 ) ในปี 2003

หลังจาก C++98 แล้ว C++ พัฒนาไปอย่างค่อนข้างช้า จนกระทั่งในปี 2011 มาตรฐาน C++11ได้ถูกเผยแพร่ ซึ่งเพิ่มคุณสมบัติใหม่มากมาย ขยายไลบรารีมาตรฐานให้กว้างขึ้น และมอบสิ่งอำนวยความสะดวกเพิ่มเติมให้กับโปรแกรมเมอร์ C++ หลังจากมี การอัปเดต C++14 เล็กน้อย ในเดือนธันวาคม 2014 ก็มีการแนะนำส่วนเพิ่มเติมใหม่ต่างๆ ใน​​C++17 [ 31 ] หลังจากได้รับการสรุปในเดือนกุมภาพันธ์ 2020 [ 32 ]ร่างมาตรฐาน C++20 ได้รับการอนุมัติเมื่อวันที่ 4 กันยายน 2020 และเผยแพร่อย่างเป็นทางการเมื่อวันที่ 15 ธันวาคม 2020 [ 33 ] [ 34 ]

เมื่อวันที่ 3 มกราคม 2018 Stroustrup ได้รับการประกาศให้เป็นผู้ชนะรางวัลCharles Stark Draper Prize for Engineering ประจำปี 2018 "สำหรับการคิดค้นและพัฒนาภาษาการเขียนโปรแกรม C++" [ 35 ]

ในเดือนธันวาคม 2022 ภาษา C++ อยู่ในอันดับที่สามของดัชนี TIOBEแซงหน้าภาษาJavaเป็นครั้งแรกในประวัติศาสตร์ของดัชนีนี้ณ เดือนพฤศจิกายน2024 ภาษานี้อยู่ในอันดับที่สองรองจากPythonโดยมี Java อยู่ในอันดับที่สาม[ 36 ]

ในเดือนมีนาคม พ.ศ. 2568 Stroustrup ได้ออกคำเรียกร้องให้ชุมชนภาษาปกป้องภาษาดังกล่าว เนื่องจากภาษานี้อนุญาตให้จัดการหน่วยความจำด้วยตนเอง บั๊กที่ก่อให้เกิดความเสี่ยงด้านความปลอดภัย เช่นบัฟเฟอร์โอเวอร์โฟลว์อาจเกิดขึ้นในโปรแกรมเมื่อโปรแกรมเมอร์ใช้งานผิดวิธีโดยไม่ได้ตั้งใจ[ 37 ]

นิรุกติศาสตร์

ตามที่ Stroustrup กล่าวไว้ว่า "ชื่อนี้บ่งบอกถึงลักษณะวิวัฒนาการของการเปลี่ยนแปลงจาก C" [ 38 ]ชื่อนี้ได้รับการยกเครดิตให้กับ Rick Mascitti (กลางปี ​​1983) [ 26 ]และถูกใช้ครั้งแรกในเดือนธันวาคม 1983 เมื่อ Mascitti ถูกถามอย่างไม่เป็นทางการในปี 1992 เกี่ยวกับการตั้งชื่อ เขาชี้ว่ามันถูกตั้งขึ้นด้วยอารมณ์ขัน ชื่อนี้มาจากตัวดำเนินการของ C (ซึ่งเพิ่มค่าของตัวแปร++)และธรรมเนียมการตั้งชื่อทั่วไปที่ใช้ "+" เพื่อบ่งชี้ถึงโปรแกรมคอมพิวเตอร์ที่ได้รับการปรับปรุง

ในระหว่างช่วงการพัฒนา C++ ภาษาดังกล่าวถูกเรียกว่า "C ใหม่" และ "C ที่มีคลาส" [ 26 ] [ 39 ]ก่อนที่จะได้รับชื่อสุดท้าย

ปรัชญา

ตลอดช่วงชีวิตของ C++ การพัฒนาและวิวัฒนาการของมันได้รับการชี้นำโดยหลักการชุดหนึ่ง: [ 24 ]

  • มันต้องเกิดจากปัญหาที่เกิดขึ้นจริง และคุณสมบัติของมันควรมีประโยชน์โดยตรงในโปรแกรมต่างๆ ในโลกแห่งความเป็นจริง
  • ทุกฟีเจอร์ควรสามารถนำไปใช้งานได้จริง (โดยมีวิธีการที่ค่อนข้างชัดเจน)
  • โปรแกรมเมอร์ควรมีอิสระในการเลือกรูปแบบการเขียนโปรแกรมของตนเอง และรูปแบบนั้นควรได้รับการสนับสนุนอย่างเต็มที่จากภาษา C++
  • การอนุญาตให้ใช้งานฟีเจอร์ที่มีประโยชน์นั้นสำคัญกว่าการป้องกันการใช้งาน C++ ในทางที่ผิดทุกรูปแบบ
  • ควรจัดให้มีสิ่งอำนวยความสะดวกสำหรับการจัดโปรแกรมออกเป็นส่วนๆ ที่แยกจากกันอย่างชัดเจน และจัดให้มีสิ่งอำนวยความสะดวกสำหรับการรวมส่วนต่างๆ ที่พัฒนาแยกจากกันเข้าด้วยกัน
  • ห้ามมีการละเมิด ระบบประเภทข้อมูลโดยปริยาย(แต่ยอมให้มีการละเมิดโดยชัดแจ้งได้ กล่าวคือ การละเมิดที่โปรแกรมเมอร์ร้องขอโดยตรง)
  • ประเภทข้อมูลที่ผู้ใช้สร้างขึ้นจะต้องได้รับการสนับสนุนและประสิทธิภาพการทำงานเช่นเดียวกับประเภทข้อมูลพื้นฐานที่มีอยู่แล้ว
  • ฟังก์ชันที่ไม่ได้ใช้งานไม่ควรส่งผลเสียต่อไฟล์ปฏิบัติการที่สร้างขึ้น (เช่น ทำให้ประสิทธิภาพลดลง)
  • ไม่ควรมีภาษาโปรแกรมใด ๆ ที่อยู่ต่ำกว่า C++ (ยกเว้นภาษาแอสเซมบลี )
  • ภาษาC++ ควรทำงานร่วมกับภาษาโปรแกรม อื่นๆ ที่มีอยู่แล้ว แทนที่จะสร้างสภาพแวดล้อมการเขียนโปรแกรม ที่แยกต่างหากและเข้ากันไม่ได้ของตัวเอง
  • หากไม่ทราบเจตนาของโปรแกรมเมอร์ ให้โปรแกรมเมอร์ระบุเจตนานั้นโดยการให้ควบคุมด้วยตนเอง

การกำหนดมาตรฐาน

มาตรฐาน C++
ปีมาตรฐาน ISO/IECชื่อเรียกอย่างไม่เป็นทางการ
199814882:1998 [ 40 ]ซี++98
200314882:2003 [ 41 ]ซี++03
201114882:2011 [ 42 ]C++11 , C++0x
201414882:2014 [ 43 ]C++14 , C++1y
201714882:2017 [ 44 ]C++17 , C++1z
202014882:2020 [ 45 ]C++20 , C++2a
202414882:2024 [ 19 ]C++23 , C++2b
รอประกาศC++26 , C++2c

C++ ได้รับการกำหนดมาตรฐานโดยกลุ่มทำงานISO ที่รู้จักกันในชื่อ JTC1/SC22/WG21กลุ่มทำงานนี้จัดการประชุมเป็นเวลาหนึ่งสัปดาห์สามครั้งในแต่ละปี[ 46 ]จนถึงปัจจุบัน ได้มีการเผยแพร่มาตรฐาน C++ ฉบับแก้ไขเจ็ดฉบับ และกำลังดำเนินการแก้ไขฉบับต่อไปคือC++ 26

ภาพบรรยากาศระหว่างการประชุมคณะกรรมการมาตรฐาน C++ ที่สตอกโฮล์มในปี 1996

ในปี 1998 คณะทำงานของ ISO ได้กำหนดมาตรฐาน C++ เป็นครั้งแรกในชื่อISO/IEC 14882:1998ซึ่งเรียกกันอย่างไม่เป็นทางการว่าC++98ต่อมาในปี 2003 ได้มีการเผยแพร่มาตรฐาน C++ เวอร์ชันใหม่ในชื่อISO/IEC 14882:2003ซึ่งแก้ไขปัญหาที่พบใน C++98

การแก้ไขมาตรฐานครั้งสำคัญถัดไปได้รับการเรียกอย่างไม่เป็นทางการว่า "C++0x" แต่ไม่ได้เผยแพร่จนกระทั่งปี 2011 [ 47 ] C++11 (14882:2011) มีส่วนเพิ่มเติมมากมายทั้งในภาษาหลักและไลบรารีมาตรฐาน[ 42 ]

ในปี 2014 C++14 (หรือที่รู้จักกันในชื่อ C++1y) ได้รับการเผยแพร่เป็นส่วนขยายเล็กๆ ของ C++11 โดยส่วนใหญ่เป็นการแก้ไขข้อบกพร่องและการปรับปรุงเล็กน้อย[ 48 ] ขั้นตอนการลงคะแนนเสียงร่างมาตรฐานสากลเสร็จสิ้นในช่วงกลางเดือนสิงหาคม 2014 [ 49 ]

หลังจาก C++14 การแก้ไขครั้งใหญ่C++17ซึ่งเรียกกันอย่างไม่เป็นทางการว่า C++1z เสร็จสมบูรณ์โดยคณะกรรมการ ISO C++ ในช่วงกลางเดือนกรกฎาคม 2017 และได้รับการอนุมัติและเผยแพร่ในเดือนธันวาคม 2017 [ 50 ]

ในส่วนหนึ่งของกระบวนการกำหนดมาตรฐาน ISO ยังได้เผยแพร่รายงานทางเทคนิคและข้อกำหนดต่างๆ ด้วย :

  • ISO/IEC TR 18015:2006 [ 51 ]เกี่ยวกับการใช้ C++ ในระบบฝังตัวและผลกระทบด้านประสิทธิภาพของภาษา C++ และคุณลักษณะของไลบรารี
  • ISO/IEC TR 19768:2007 [ 52 ] (หรือที่รู้จักกันในชื่อC++ Technical Report 1 ) เกี่ยวกับส่วนขยายไลบรารีส่วนใหญ่ที่รวมอยู่ในC++ 11
  • ISO/IEC TR 29124:2010 [ 53 ]เกี่ยวกับฟังก์ชันทางคณิตศาสตร์พิเศษที่รวมเข้ากับC++ 17
  • ISO/IEC TR 24733:2011 [ 54 ]เกี่ยวกับเลขคณิตจุดลอยตัวทศนิยม
  • ISO/IEC TS 18822:2015 [ 55 ]เกี่ยวกับไลบรารีระบบไฟล์มาตรฐานที่รวมเข้ากับC++ 17
  • ISO/IEC TS 19570:2015 [ 56 ]เกี่ยวกับ เวอร์ชัน คู่ขนานของอัลกอริธึมไลบรารีมาตรฐานที่รวมเข้ากับC++ 17
  • ISO/IEC TS 19841:2015 [ 57 ]เกี่ยวกับหน่วยความจำธุรกรรมซอฟต์แวร์
  • ISO/IEC TS 19568:2015 [ 58 ]เกี่ยวกับชุดส่วนขยายไลบรารีใหม่ ซึ่งบางส่วนได้ถูกรวมเข้าไว้ในC++17แล้ว
  • ISO/IEC TS 19217:2015 [ 59 ] เกี่ยวกับ แนวคิด C++ ซึ่งรวมเข้ากับC++ 20
  • ISO/IEC TS 19571:2016 [ 60 ]เกี่ยวกับส่วนขยายไลบรารีสำหรับการทำงานพร้อมกัน ซึ่งบางส่วนได้ถูกรวมเข้าไว้ในC++20แล้ว
  • ISO/IEC TS 19568:2017 [ 61 ]เกี่ยวกับชุดส่วนขยายไลบรารีอเนกประสงค์ชุดใหม่
  • ISO/IEC TS 21425:2017 [ 62 ]เกี่ยวกับส่วนขยายไลบรารีสำหรับช่วงที่รวมเข้ากับC++ 20
  • ISO/IEC TS 22277:2017 [ 63 ]เกี่ยวกับ coroutines ที่รวมเข้ากับC++ 20
  • ISO/IEC TS 19216:2018 [ 64 ]เกี่ยวกับไลบรารีเครือข่าย
  • ISO/IEC TS 21544:2018 [ 65 ]เกี่ยวกับโมดูลที่รวมเข้ากับC++ 20
  • ISO/IEC TS 19570:2018 [ 66 ]เกี่ยวกับชุดส่วนขยายไลบรารีใหม่สำหรับการทำงานแบบขนาน
  • ISO/IEC TS 23619:2021 [ 67 ]เกี่ยวกับส่วนขยายใหม่สำหรับการเขียนโปรแกรมแบบสะท้อน (การสะท้อน)
  • ISO/IEC TS 9922:2024 [ 68 ]เกี่ยวกับชุดส่วนขยายการทำงานพร้อมกันชุดใหม่ และ
  • ISO/IEC TS 19568:2024 [ 69 ]เกี่ยวกับชุดส่วนขยายไลบรารีชุดใหม่อีกชุดหนึ่ง

ข้อกำหนดทางเทคนิคเพิ่มเติมอยู่ระหว่างการพัฒนาและรอการอนุมัติ

ภาษา

ภาษา C++ มีส่วนประกอบหลักสองส่วน ได้แก่ การแมปโดยตรงของคุณสมบัติฮาร์ดแวร์ที่จัดเตรียมโดยส่วนย่อย C เป็นหลัก และนามธรรมที่ไม่มีค่าใช้จ่ายเพิ่มเติมโดยอิงจากการแมปเหล่านั้น Stroustrup อธิบาย C++ ว่าเป็น "ภาษาการเขียนโปรแกรมนามธรรมที่มีน้ำหนักเบา [ออกแบบ] สำหรับการสร้างและใช้งานนามธรรมที่มีประสิทธิภาพและสง่างาม" [ 17 ] และ "การนำเสนอทั้งการเข้าถึงฮาร์ดแวร์และนามธรรมเป็นพื้นฐานของ C++ การทำเช่นนั้นอย่างมีประสิทธิภาพคือสิ่งที่ทำให้มันแตกต่างจากภาษาอื่นๆ" [ 70 ]

C++ สืบทอดไวยากรณ์ส่วนใหญ่ของ Cโปรแกรมhello world ที่สอดคล้องกับมาตรฐาน Cก็เป็นโปรแกรม hello world ที่ถูกต้องใน C++ เช่นกัน ต่อไปนี้ดัดแปลงมาจากโปรแกรมHello world เวอร์ชันของ Bjarne Stroustrup ที่ใช้ ฟังก์ชัน stream ของไลบรารีมาตรฐาน C++เพื่อเขียนข้อความไปยังเอาต์พุตมาตรฐาน : [ 71 ] [ 72 ] [ c ]

#include <iostream>int main () {std :: cout << "Hello, world! \n " ;}

ตั้งแต่C++23 เป็นต้น มา ด้วยการแนะนำ ฟังก์ชัน std::printและโมดูลstdทำให้สามารถแสดงข้อความนี้ได้กระชับยิ่งขึ้นดังนี้:

import std ;int main () {std :: println ( "Hello, world!" );}

ไลบรารีมาตรฐาน

ร่างมาตรฐาน "เอกสารการทำงาน" ที่ได้รับการอนุมัติให้เป็น C++98 นั้น ครึ่งหนึ่งของขนาดเอกสารถูกใช้ไปกับไลบรารีมาตรฐานของ C++

มาตรฐาน C++ ระบุทั้งภาษาหลักและไลบรารีมาตรฐานข้อกำหนดเกี่ยวกับไลบรารีอธิบายเนื้อหาของไลบรารี วิธีที่โปรแกรม C++ ที่ถูกต้องใช้ไลบรารี และข้อกำหนดที่กำหนดไว้สำหรับการใช้งานที่สอดคล้อง[ 73 ]

ไลบรารีมาตรฐานถูกจัดระเบียบเป็นพื้นที่ต่างๆ เช่น การสนับสนุนภาษา การวินิจฉัยการจัดการหน่วยความจำเมตาโปรแกรมมิ่งยูทิลิตี้ทั่วไปคอนเทนเนอร์ตัววนซ้ำช่วงอัลกอริทึม สตริงการ ประมวล ผลข้อความตัวเลขเวลาอินพุต/เอาต์พุตและการสนับสนุนการทำงานพร้อมกัน[ 73 ]นอกจากนี้ยังจัดเตรียมสิ่งอำนวยความสะดวกของไลบรารีมาตรฐาน C ผ่าน ส่วนหัว C++ เช่น<cstdio>และ<cstdlib>ยกเว้นชื่อที่กำหนดเป็นมาโครใน C การประกาศเหล่านี้จะถูกวางไว้ในเนมสเปstd[ 74 ]

สิ่งอำนวยความสะดวกของไลบรารีมักจะพร้อมใช้งานโดยการรวมส่วนหัวมาตรฐาน เช่นตั้งแต่ C++20 เป็นต้นมา ส่วนหัวไลบรารีมาตรฐานที่สามารถนำเข้าได้ยังสามารถนำเข้าเป็นหน่วยส่วนหัวได้อีกด้วย C++23 ได้เพิ่มโมดูลไลบรารีมาตรฐานที่มีชื่อและ: ส่งออกการประกาศในเนมสเปซในขณะเดียวกันก็ส่งออกการประกาศเนมสเปซส่วนกลางที่สอดคล้องกันสำหรับสิ่งอำนวยความสะดวกของไลบรารี C ด้วย[ 75 ]#include<vector>stdstd.compatstdstdstd.compat

อิทธิพลสำคัญต่อไลบรารีมาตรฐานคือStandard Template Library (STL) ซึ่งเป็นไลบรารีการเขียนโปรแกรมทั่วไปที่เสนอต่อคณะกรรมการมาตรฐาน C++ โดย Alexander Stepanov และ Meng Lee ในปี 1994 รูปแบบของคอนเทนเนอร์ ตัววนซ้ำ และอัลกอริทึมทั่วไปได้กลายเป็นส่วนหนึ่งของ Standard C++ Library แม้ว่าไลบรารีมาตรฐานจะมีสิ่งอำนวยความสะดวกอื่นๆ อีกมากมาย เช่น การรับ/ส่งข้อมูล การแปล การวินิจฉัย และชุดย่อยของไลบรารี C [ 76 ] [ 77 ]

หลักเกณฑ์หลักของ C++

แนวทางหลักของ C++ [ 78 ]เป็นโครงการริเริ่มที่นำโดย Stroustrup และ Herb Sutter ผู้ประสานงานและประธานกลุ่มทำงาน C++ ISO เพื่อช่วยให้โปรแกรมเมอร์เขียน 'Modern C++' โดยใช้แนวทางปฏิบัติที่ดีที่สุดสำหรับมาตรฐานภาษา C++11 และเวอร์ชันใหม่กว่า และเพื่อช่วยให้นักพัฒนาคอมไพเลอร์และเครื่องมือตรวจสอบแบบคงที่สร้างกฎสำหรับการตรวจจับแนวทางการเขียนโปรแกรมที่ไม่ดี จุดมุ่งหมายหลักคือการเขียน C++ ที่ปลอดภัยทั้งประเภทและทรัพยากรอย่างมีประสิทธิภาพและสม่ำเสมอ อย่างไรก็ตาม แนวทางเหล่านี้ไม่ได้รับการรับรองจากคณะกรรมการมาตรฐาน ISO C++ และไม่ได้แสดงถึงฉันทามติของคณะกรรมการ[ 79 ]

แนวทางหลักได้รับการประกาศ[ 80 ]ในการกล่าวเปิดงาน CPPCon 2015

แนวทางดังกล่าวมาพร้อมกับไลบรารีสนับสนุนแนวทาง (GSL) ซึ่งเป็นไลบรารีส่วนหัวเท่านั้นของประเภทและฟังก์ชันเพื่อนำแนวทางหลักไปใช้ และเครื่องมือตรวจสอบแบบคงที่สำหรับการบังคับใช้กฎของแนวทาง[ 81 ]หนึ่งในการใช้งานที่ใหญ่ที่สุดคือการใช้งานของ Microsoft [ 82 ]คุณสมบัติที่มีอยู่มากมายใน GSL ได้ถูกรวมเข้ากับภาษาในภายหลัง เช่นตัวstd::byteชี้อัจฉริยะ และ[ 82std::span ]

ความเข้ากันได้

เพื่อให้ผู้ผลิตคอมไพเลอร์มีอิสระมากขึ้น คณะกรรมการมาตรฐาน C++ จึงตัดสินใจที่จะไม่กำหนดการใช้งานการแปลงชื่อการจัดการข้อยกเว้นและคุณสมบัติเฉพาะการใช้งานอื่นๆ ข้อเสียของการตัดสินใจนี้คือ คาดว่าโค้ดออบเจ็กต์ ที่สร้างโดย คอมไพเลอร์ต่างๆจะไม่เข้ากัน อย่างไรก็ตาม มีความพยายามที่จะกำหนดมาตรฐานคอมไพเลอร์สำหรับเครื่องหรือระบบปฏิบัติการ เฉพาะ ตัวอย่างเช่น Itanium C++ ABI เป็นอิสระจากโปรเซสเซอร์ (แม้จะมีชื่อเช่นนั้น) และถูกนำไปใช้โดย GCC และ Clang [ 83 ]

ด้วยซี

C++ มักถูกมองว่าเป็นซูเปอร์เซ็ตของCแต่ความจริงแล้วไม่ใช่เช่นนั้นเสมอไป[ 84 ]โค้ด C ส่วนใหญ่สามารถคอมไพล์ได้อย่างถูกต้องใน C++ แต่มีความแตกต่างเล็กน้อยที่ทำให้โค้ด C ที่ถูกต้องบางส่วนไม่ถูกต้องหรือทำงานแตกต่างกันใน C++ ตัวอย่างเช่น C อนุญาตให้แปลงโดยปริยายจากประเภทพอยเตอร์หนึ่งไปยังอีกประเภทหนึ่ง แต่ C++ ไม่อนุญาต (ด้วยเหตุผลด้านความปลอดภัยของประเภท) นอกจากนี้ C++ ยังกำหนดคำหลักใหม่หลายคำ เช่นและซึ่งอาจใช้เป็นตัวระบุ (เช่น ชื่อตัวแปร) ในโปรแกรม Cvoid*newclass

ความไม่เข้ากันบางประการได้รับการแก้ไขโดยมาตรฐาน C ฉบับปรับปรุงปี 1999 ( C99 ) ซึ่งขณะนี้รองรับคุณสมบัติของ C++ เช่น ความคิดเห็นบรรทัด ( //) และการประกาศที่ผสมกับโค้ด ในทางกลับกัน C99 ได้แนะนำคุณสมบัติใหม่จำนวนหนึ่งที่ C++ ไม่รองรับ ซึ่งไม่เข้ากันหรือซ้ำซ้อนใน C++ เช่นอาร์เรย์ที่มีความยาวแปรผันประเภทจำนวนเชิงซ้อนดั้งเดิม (อย่างไรก็ตามคลาสในไลบรารีมาตรฐาน C++ ให้ฟังก์ชันการทำงานที่คล้ายกัน แม้ว่าจะไม่เข้ากันกับโค้ดก็ตาม) ตัวเริ่มต้นที่กำหนดตัวอักษรประกอบและคำหลัก[ 85 ]คุณสมบัติบางอย่างที่ C99 แนะนำได้ถูกรวมไว้ในมาตรฐาน C++ เวอร์ชันถัดไปC++11 (จากคุณสมบัติที่ไม่ซ้ำซ้อน) [ 86 ] [ 87 ] [ 88 ]อย่างไรก็ตาม มาตรฐาน C++11 ได้แนะนำความไม่เข้ากันใหม่ เช่น การไม่อนุญาตให้กำหนดค่าตัวอักษรสตริงให้กับตัวชี้อักขระ ซึ่งยังคงเป็น C ที่ถูกต้องstd::complexrestrict

ในการผสมผสานโค้ด C และ C++ เข้าด้วยกัน การประกาศหรือนิยามฟังก์ชันใดๆ ที่จะถูกเรียกใช้/ใช้งานทั้งในภาษา C และ C++ จะต้องประกาศโดยใช้การเชื่อมโยงแบบ C โดยการวางไว้ภายในบล็อก ฟังก์ชันดังกล่าวจะต้องไม่พึ่งพาคุณสมบัติที่ขึ้นอยู่กับการแปลงชื่อ (เช่น การโอเวอร์โหลดฟังก์ชัน)extern"C"{/*...*/}

การประกอบแบบอินไลน์

โปรแกรมที่พัฒนาด้วยภาษา C หรือ C++ มักใช้ภาษาแอสเซมบลีแบบอินไลน์เพื่อใช้ประโยชน์จากฟังก์ชันระดับต่ำ ความเร็วที่มากขึ้น และการควบคุมที่ดียิ่งขึ้นเมื่อเทียบกับภาษาโปรแกรมระดับสูง[ 89 ] [ 90 ]เมื่อการเพิ่มประสิทธิภาพเป็นสิ่งสำคัญ ภาษา C++ ให้การสนับสนุนการฝัง ภาษา แอสเซมบลีโดยใช้การประกาศ asm [ 91 ]แต่ความเข้ากันได้ของ ภาษา แอสเซมบลีแบบอินไลน์จะแตกต่างกันอย่างมากระหว่างคอมไพเลอร์และสถาปัตยกรรม ต่างจากคุณสมบัติของภาษาโปรแกรมระดับสูง เช่นPythonหรือJavaโค้ดแอสเซมบลีขึ้นอยู่กับโปรเซสเซอร์และการใช้งานคอมไพเลอร์พื้นฐานเป็นอย่างมาก

ความแตกต่างระหว่างคอมไพเลอร์ต่างๆ

คอมไพเลอร์ C++ แต่ละตัวมีวิธีการใช้งานแอสเซมบลีแบบอินไลน์ที่แตกต่างกัน

  • GCC ( GNU Compiler Collection ) และClang : [ 92 ]คอมไพเลอร์ทั้งสองใช้ไวยากรณ์แอสเซมบลีแบบอินไลน์ที่ขยายของ GCC โดยใช้__asm__คำหลักแทนasmเมื่อเขียนโค้ดที่สามารถคอมไพล์ได้ด้วยตัวเลือก ซึ่งช่วยให้สามารถระบุตัวดำเนินการอินพุต/เอาต์พุตและรีจิสเตอร์ที่ถูกเปลี่ยนแปลงได้ แนวทางนี้ยังถูกนำไปใช้ในที่อื่น ๆ ด้วย รวมถึงคอมไพเลอร์ ของ Intel [ 93 ]และ IBM [ 94 ]-ansi-std
  • MSVC ( Microsoft Visual C++ ): ตัวประกอบแอสเซมบลีแบบอินไลน์ถูกสร้างขึ้นในคอมไพเลอร์ ก่อนหน้านี้รองรับการประกอบแอสเซมบลีแบบอินไลน์ผ่าน__asmคีย์เวิร์ด แต่การสนับสนุนนี้ถูกลบออกในโหมด 64 บิต ทำให้ต้องใช้โมดูล .asm แยกต่างหากแทน[ 95 ]
  • TI ARM Clang และคอมไพเลอร์ฝังตัว: [ 96 ]คอมไพเลอร์ระบบฝังตัวบางตัว เช่น TI Arm Clang ของ Texas Instruments อนุญาตให้ใช้แอสเซมบลีแบบอินไลน์ แต่กำหนดกฎที่เข้มงวดกว่าเพื่อหลีกเลี่ยงความขัดแย้งกับข้อกำหนดการลงทะเบียนและข้อกำหนดการเรียก

ความสามารถในการทำงานร่วมกันระหว่างภาษา C++ และภาษา Assembly

C++ มีวิธีการหลักสองวิธีในการผสานรวมโค้ด ASM ได้แก่ ไฟล์แอสเซมบลีแบบสแตนด์อะโลน ซึ่งโค้ดแอสเซมบลีจะถูกเขียนแยกต่างหากและเชื่อมโยงกับโค้ด C++ [ 97 ]และแอสเซมบลีแบบอินไลน์ซึ่งโค้ดแอสเซมบลีจะถูกฝังอยู่ภายในโค้ด C++ โดยใช้ส่วนขยายเฉพาะของคอมไพเลอร์

ดูเพิ่มเติม

หมายเหตุ

  1. สำหรับแนวคิดของ coroutines แบบไร้ stack ใน C++20
  2. ออกเสียงว่า / ˈ s p l ʌ s p l ʌ s / ดูPLUSS PLUSS และบางครั้ง ย่อเป็น CPPหรือ CXX
  3. โค้ดนี้ดัดแปลงมาจากหน้าแก้ไขข้อผิดพลาดของ Bjarne Stroustrup (หน้า 633) เขาได้กล่าวถึงการใช้'\n'แทนที่จะใช้ นอกจากนี้std::endlโปรดดูที่ฉันสามารถเขียน "void main()" ได้หรือไม่? เก็บถาวรเมื่อวันที่ 2 กรกฎาคม 2020 ที่ Wayback Machineสำหรับคำอธิบายเกี่ยวกับค่าส่งคืนโดยปริยายreturn 0;ในmainฟังก์ชัน ค่าส่งคืนโดยปริยายนี้ไม่มีในฟังก์ชันอื่นๆ

อ่านเพิ่มเติม

  • Abrahams, David ; Gurtovoy, Aleksey (2005). C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond . Addison-Wesley. ISBN 0-321-22725-5.
  • Alexandrescu, Andrei (2001). การออกแบบ C++ สมัยใหม่: การเขียนโปรแกรมแบบทั่วไปและรูปแบบการออกแบบที่นำไปใช้ . Addison-Wesley. ISBN 0-201-70431-5.
  • Alexandrescu, Andrei ; Sutter, Herb (2004). มาตรฐานการออกแบบและการเขียนโค้ด C++: กฎและแนวทางสำหรับการเขียนโปรแกรม Addison-Wesley. ISBN 0-321-11358-6.
  • Becker, Pete (2006). ส่วนขยายไลบรารีมาตรฐาน C++  : คู่มือและเอกสารอ้างอิง Addison-Wesley. ISBN 0-321-41299-0.
  • บร็อกเคน, แฟรงค์ (2026) [ปีที่ตีพิมพ์ครั้งแรก: 1994]. คำอธิบายประกอบ C++ . ISBN 978-90-367-0470-0.
  • Coplien, James O. (1994) [พิมพ์ซ้ำพร้อมแก้ไข ปีที่พิมพ์เดิม 1992]. Advanced C++: Programming Styles and Idioms . Addison-Wesley. ISBN 0-201-54855-0.
  • Dewhurst, Stephen C. (2005). ความรู้ทั่วไปเกี่ยวกับ C++: การเขียนโปรแกรมระดับกลางที่จำเป็น . Addison-Wesley. ISBN 0-321-32192-8.
  • สภาอุตสาหกรรมเทคโนโลยีสารสนเทศ (15 ตุลาคม 2546). ภาษาโปรแกรม – C++ (  ฉบับที่สอง). เจนีวา: ISO/IEC. 14882:2003(E).
  • Josuttis, Nicolai M. (2012). ไลบรารีมาตรฐาน C++, คู่มือและเอกสารอ้างอิง (  ฉบับที่สอง). Addison-Wesley. ISBN 978-0-321-62321-8.
  • Koenig, Andrew ; Moo, Barbara E. (2000). Accelerated C++ – Practical Programming by Example . Addison-Wesley. ISBN 0-201-70353-X.
  • ลิปป์แมน, สแตนลีย์ บี. ; ลาฌอย, โฮเซ่; หมู่, บาร์บาร่า อี. (2011) C++ Primer (  ฉบับที่ห้า) แอดดิสัน-เวสลีย์. ไอเอสบีเอ็น 978-0-321-71411-4.
  • Lippman, Stanley B. (1996). Inside the C++ Object Model . Addison-Wesley. ISBN 0-201-83454-5.
  • Meyers, Scott (2005). Effective C++ (  ฉบับที่สาม). Addison-Wesley. ISBN 0-321-33487-6.
  • Stroustrup, Bjarne (2013). ภาษาการเขียนโปรแกรม C++ (  ฉบับที่สี่). Addison-Wesley. ISBN 978-0-321-56384-2.
  • Stroustrup, Bjarne (1994). การออกแบบและวิวัฒนาการของ C++ Addison-Wesley. ISBN 0-201-54330-3.
  • Stroustrup, Bjarne (2014). การเขียนโปรแกรม: หลักการและการปฏิบัติโดยใช้ C++ (  ฉบับที่สอง). Addison-Wesley. ISBN 978-0-321-99278-9.
  • Sutter, Herb (2001). More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions . Addison-Wesley. ISBN 0-201-70434-X.
  • Sutter, Herb (2004). สไตล์ C++ ที่ยอดเยี่ยม . Addison-Wesley. ISBN 0-201-76042-8.
  • แวนเดวอร์เด, เดวิด; โจสุตติส, นิโคไล เอ็ม. (2003) เทมเพลต C++: คู่มือฉบับสมบูรณ์ แอดดิสัน-เวสลีย์. ไอเอสบีเอ็น 0-201-73484-2.
  • JTC1/SC22/WG21 – กลุ่มงานมาตรฐาน C++ ของ ISO/IEC
  • มูลนิธิ Standard C++ Foundation – องค์กรไม่แสวงหาผลกำไรที่ส่งเสริมการใช้งานและความเข้าใจในมาตรฐาน C++ โดยBjarne Stroustrupเป็นกรรมการขององค์กรนี้
  • คำหลัก C++
  • นิพจน์ C++
  • ลำดับความสำคัญของตัวดำเนินการใน C++
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=C%2B%2B&oldid=1362973620#Standard_library "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ซี++

C++ เป็น ภาษาโปรแกรม ระดับสูงอเนกประสงค์ที่สร้างขึ้นโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวเดนมาร์กBjarne Stroustrupเปิดตัวครั้งแรกในปี 1985 ในฐานะส่วนขยายของภาษาโปรแกรม Cโดยเพิ่ม...

ประวัติศาสตร์

ในปี 1979 บียาร์เน สโตรสตรุป นักวิทยาศาสตร์คอมพิวเตอร์ ชาวเดนมาร์กเริ่มทำงานเกี่ยวกับ " C ที่มี คลาส ซึ่งเป็นภาษาต้นแบบของ C++ [ 23 ] แรงจูงใจในการสร้างภาษาใหม่นี้มาจากประสบการณ์การเขียนโปรแกรมของ Stroustrup สำหรับวิทยานิพนธ์ปริญญาเอกของเขา Stroustrup พบว่า...

นิรุกติศาสตร์

ตามที่ Stroustrup กล่าวไว้ว่า "ชื่อนี้บ่งบอกถึงลักษณะวิวัฒนาการของการเปลี่ยนแปลงจาก C" [ 38 ] ชื่อนี้ได้รับการยกเครดิตให้กับ Rick Mascitti (กลางปี ​​1983) [ 26 ] และถูกใช้ครั้งแรกในเดือนธันวาคม 1983 เมื่อ Mascitti ถูกถามอย่างไม่เป็นทางการในปี 1992...

ปรัชญา

ตลอดช่วงชีวิตของ C++ การพัฒนาและวิวัฒนาการของมันได้รับการชี้นำโดยหลักการชุดหนึ่ง: [ 24 ]