ห้องสมุดมาตรฐาน C

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

ห้องสมุดมาตรฐาน Cหรือlibcเป็นห้องสมุดมาตรฐานสำหรับการเขียนโปรแกรมภาษา Cตามที่ระบุไว้ในมาตรฐาน ISO Cมาตรฐาน[1]เริ่มต้นจากมาตรฐาน ANSI Cดั้งเดิมได้รับการพัฒนาควบคู่ไปกับข้อกำหนดของไลบรารี C POSIXซึ่งเป็นซูเปอร์เซ็ตของมัน[2] [3]ตั้งแต่ ANSI C เป็นลูกบุญธรรมโดยองค์การระหว่างประเทศเพื่อการมาตรฐาน , [4]ห้องสมุดมาตรฐาน C จะเรียกว่าห้องสมุด ISO C

มาตรฐานห้องสมุด C ให้แมโคร , ประเภทคำจำกัดความและฟังก์ชั่นสำหรับงานต่างๆเช่นสตริงการจัดการการคำนวณทางคณิตศาสตร์อินพุต / เอาต์พุตการประมวลผล, การจัดการหน่วยความจำและอื่น ๆ อีกหลายระบบปฏิบัติการบริการ

อินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน

ไฟล์ส่วนหัว

อินเตอร์เฟซการเขียนโปรแกรมประยุกต์ (API) ของห้องสมุดมาตรฐาน C มีการประกาศในจำนวนของไฟล์ส่วนหัว ไฟล์ส่วนหัวแต่ละไฟล์มีการประกาศฟังก์ชัน คำนิยามประเภทข้อมูล และมาโครตั้งแต่หนึ่งรายการขึ้นไป

หลังจากเสถียรภาพเป็นเวลานาน ไฟล์ส่วนหัวใหม่สามไฟล์ ( iso646.h, wchar.h, และwctype.h) ถูกเพิ่มด้วยNormative Addendum 1 (NA1) ซึ่งเป็นการเพิ่มมาตรฐาน C ที่ได้รับการรับรองในปี 1995 มีการเพิ่มไฟล์ส่วนหัวอีก 6 ไฟล์ ( complex.h, fenv.h, inttypes.h, stdbool.h, stdint.h, และtgmath.h) ด้วยC99การแก้ไขมาตรฐาน C ที่เผยแพร่ในปี 2542 และอีกห้าไฟล์ ( stdalign.h, stdatomic.h, stdnoreturn.h, threads.h, และuchar.h) ที่มีC11ในปี 2011 โดยรวมแล้วมีไฟล์ส่วนหัว 29 ไฟล์:

ชื่อ จาก คำอธิบาย
<assert.h> ประกอบด้วยมาโครยืนยันซึ่งใช้เพื่อช่วยในการตรวจหาข้อผิดพลาดเชิงตรรกะและข้อบกพร่องประเภทอื่นๆ ในการดีบักเวอร์ชันของโปรแกรม
<complex.h> C99 ชุดของฟังก์ชั่นสำหรับการจัดการตัวเลขที่ซับซ้อน
<ctype.h> กำหนดชุดของฟังก์ชันที่ใช้ในการจำแนกอักขระตามประเภทหรือเพื่อแปลงระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็กในลักษณะที่ไม่ขึ้นกับชุดอักขระที่ใช้(โดยทั่วไปคือASCIIหรือส่วนขยายอย่างใดอย่างหนึ่ง แม้ว่าจะรู้จักการนำไปใช้งานโดยใช้EBCDICก็ตาม)
<errno.h> สำหรับการทดสอบรหัสข้อผิดพลาดที่รายงานโดยฟังก์ชันห้องสมุด
<fenv.h> C99 กำหนดชุดของฟังก์ชันสำหรับควบคุมสภาวะแวดล้อม แบบทศนิยม
<float.h> กำหนดค่าคงที่แมโครที่ระบุคุณสมบัติเฉพาะการใช้งานของไลบรารี ทศนิยม
<inttypes.h> C99 กำหนดประเภทจำนวนเต็มแน่นอนกว้าง
<iso646.h> NA1 กำหนดมาโครหลายตัวที่ใช้วิธีอื่นในการแสดงโทเค็นมาตรฐานหลายรายการ สำหรับการเขียนโปรแกรมในชุดอักขระตัวแปร ISO 646
<limits.h> กำหนดค่าคงที่มาโครที่ระบุคุณสมบัติเฉพาะการใช้งานของประเภทจำนวนเต็ม
<locale.h> กำหนดฟังก์ชั่นการแปล
<math.h> กำหนดฟังก์ชั่นทางคณิตศาสตร์ที่พบบ่อย
<setjmp.h> ประกาศมาโครsetjmpและlongjmpซึ่งใช้สำหรับการออกนอกเครื่อง
<signal.h> กำหนดฟังก์ชั่นการจัดการสัญญาณ
<stdalign.h> C11 สำหรับการสอบถามและระบุการจัดตำแหน่งของวัตถุ
<stdarg.h> สำหรับการเข้าถึงอาร์กิวเมนต์จำนวนต่างๆ ที่ส่งผ่านไปยังฟังก์ชันต่างๆ
<stdatomic.h> C11 สำหรับการดำเนินการแบบอะตอมมิกกับข้อมูลที่แชร์ระหว่างเธรด
<stdbool.h> C99 กำหนดชนิดข้อมูลแบบบูล
<stddef.h> กำหนดประเภทที่มีประโยชน์หลายและมาโคร
<stdint.h> C99 กำหนดประเภทจำนวนเต็มแน่นอนกว้าง
<stdio.h> กำหนดฟังก์ชันอินพุตและเอาต์พุตหลัก
<stdlib.h> กำหนดฟังก์ชั่นการแปลงตัวเลข , สุ่มหลอกฟังก์ชั่นหมายเลขรุ่น , จัดสรรหน่วยความจำ , ฟังก์ชั่นการควบคุมกระบวนการ
<stdnoreturn.h> C11 สำหรับระบุฟังก์ชันไม่ส่งคืน
<string.h> กำหนดฟังก์ชันการจัดการสตริง
<tgmath.h> C99 กำหนดฟังก์ชั่นทางคณิตศาสตร์ประเภททั่วไป
<threads.h> C11 กำหนดฟังก์ชันสำหรับจัดการหลายเธรด , mutexesและตัวแปรเงื่อนไข
<time.h> กำหนดฟังก์ชันการจัดการวันที่และเวลา
<uchar.h> C11 ประเภทและฟังก์ชั่นสำหรับการจัดการUnicodeตัวอักษร
<wchar.h> NA1 กำหนดฟังก์ชันการจัดการสายอักขระกว้าง
<wctype.h> NA1 กำหนดชุดของฟังก์ชันที่ใช้ในการจำแนกอักขระแบบกว้างตามประเภทหรือเพื่อแปลงระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก

ไฟล์ส่วนหัวสามไฟล์ ( complex.h, stdatomic.h, และthreads.h) เป็นคุณสมบัติตามเงื่อนไขที่ไม่จำเป็นต้องรองรับการใช้งาน

POSIXมาตรฐานเพิ่มหลายหัว C ที่ไม่เป็นมาตรฐานสำหรับการทำงาน Unix เฉพาะ หลายคนได้พบหนทางสู่สถาปัตยกรรมอื่นๆ ตัวอย่าง ได้แก่unistd.hและsignal.h. กลุ่มอื่นๆ จำนวนหนึ่งกำลังใช้ส่วนหัวที่ไม่เป็นมาตรฐานอื่น – GNU C Libraryมีalloca.hและ HP OpenVMSมีva_count()ฟังก์ชัน

เอกสาร

บน Unix เหมือนระบบเอกสารสิทธิ์ของ API การใช้งานจริงจะอยู่ในรูปแบบของหน้าคน ในระบบส่วนใหญ่ หน้าคนในฟังก์ชันไลบรารีมาตรฐานอยู่ในส่วนที่ 3; ส่วนที่ 7 อาจมีหน้าทั่วไปเพิ่มเติมเกี่ยวกับแนวคิดพื้นฐาน (เช่นman 7 math_errorในLinux )

การใช้งาน

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

บน Microsoft Windows ไลบรารีไดนามิกของระบบหลัก ( DLLs ) จัดให้มีการใช้งานไลบรารีมาตรฐาน C สำหรับคอมไพเลอร์Microsoft Visual C++ v6.0; ไลบรารีมาตรฐาน C สำหรับคอมไพเลอร์ Microsoft Visual C++ เวอร์ชันใหม่กว่านั้นถูกจัดเตรียมโดยคอมไพเลอร์แต่ละตัวแยกกัน รวมถึงแพ็คเกจที่แจกจ่ายต่อได้ แอปพลิเคชันที่คอมไพล์แล้วที่เขียนด้วยภาษา C นั้นเชื่อมโยงแบบสแตติกกับไลบรารี C หรือเชื่อมโยงกับเวอร์ชันไดนามิกของไลบรารีที่จัดส่งมาพร้อมกับแอปพลิเคชันเหล่านี้ แทนที่จะต้องพึ่งพาให้ปรากฏบนระบบเป้าหมาย ฟังก์ชันในไลบรารี C ของคอมไพเลอร์ไม่ถือเป็นส่วนต่อประสานกับ Microsoft Windows

มีการนำไปใช้งานอื่นๆ มากมาย มีทั้งระบบปฏิบัติการและคอมไพเลอร์ C ที่หลากหลาย การใช้งานที่ได้รับความนิยมบางส่วนมีดังต่อไปนี้:

  • BSD libcการใช้งานต่าง ๆ กระจายกับBSD -derived ระบบปฏิบัติการ
  • GNU C Library (glibc) ใช้ในGNU Hurd , GNU/kFreeBSDและLinux
  • ไลบรารีรันไทม์ของ Microsoft Cซึ่งเป็นส่วนหนึ่งของMicrosoft Visual C++
  • dietlibcการใช้งานขนาดเล็กทางเลือกของไลบรารีมาตรฐาน C (MMU-less)
  • μClibcไลบรารีมาตรฐาน C สำหรับระบบμClinuxแบบฝัง(น้อยกว่า MMU)
  • Newlibไลบรารีมาตรฐาน C สำหรับระบบฝังตัว (MMU-less) [5]และใช้ในการแจกจ่ายCygwin GNU สำหรับ Windows
  • klibcเป็นหลักสำหรับการบูทระบบ Linux
  • muslการใช้งานไลบรารี C มาตรฐานน้ำหนักเบาอีกตัวสำหรับระบบ Linux [6]
  • Bionicซึ่งเดิมพัฒนาโดย Google สำหรับระบบปฏิบัติการระบบฝังตัวของ Android ซึ่งได้มาจาก BSD libc

ฟังก์ชั่นในตัวคอมไพเลอร์

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

อย่างไรก็ตาม ฟังก์ชันในตัวต้องทำงานเหมือนกับฟังก์ชันทั่วไปตาม ISO C ความหมายหลักคือโปรแกรมต้องสามารถสร้างตัวชี้ไปยังฟังก์ชันเหล่านี้โดยใช้ที่อยู่ และเรียกใช้ฟังก์ชันโดยใช้ตัวชี้นั้น ถ้าตัวชี้สองตัวที่ชี้ไปยังฟังก์ชันเดียวกันได้รับมาจากหน่วยการแปลที่แตกต่างกันสองหน่วยในโปรแกรม ตัวชี้สองตัวนี้ต้องเปรียบเทียบเท่ากัน นั่นคือที่อยู่มาโดยการแก้ไขชื่อของฟังก์ชันซึ่งมีการเชื่อมโยงภายนอก (ทั้งโปรแกรม)

ลิงค์ libm

ภายใต้ FreeBSD [8]และ glibc [9]ฟังก์ชันบางอย่างเช่น sin() จะไม่ถูกเชื่อมโยงโดยค่าเริ่มต้น และจะรวมอยู่ในไลบรารีคณิตศาสตร์libmแทน ถ้าใด ๆ -lmของพวกเขามีการใช้ลิงเกอร์จะต้องได้รับคำสั่ง POSIX ต้องการให้คอมไพเลอร์ c99 รองรับ-lmและฟังก์ชันที่ประกาศไว้ในส่วนหัวmath.h, complex.h, และfenv.hพร้อมสำหรับการเชื่อมโยงหาก-lmมีการระบุไว้ แต่ไม่ได้ระบุว่าฟังก์ชันนั้นเชื่อมโยงโดยค่าเริ่มต้นหรือไม่ [10] musl เป็นไปตามข้อกำหนดนี้โดยใส่ทุกอย่างลงในไลบรารี libc เดียวและจัดเตรียม libm ที่ว่างเปล่า (11)

การตรวจจับ

ตามมาตรฐาน C แมโคร__STDC_HOSTED__จะถูกกำหนดเป็น1หากมีการโฮสต์การใช้งาน การใช้งานแบบโฮสต์มีส่วนหัวทั้งหมดที่ระบุโดยมาตรฐาน C การนำไปใช้งานสามารถเป็นแบบอิสระได้ซึ่งหมายความว่าจะไม่มีส่วนหัวเหล่านี้ หากการดำเนินการเป็นอิสระก็จะต้องกำหนด__STDC_HOSTED__ไป0

แนวคิด ปัญหา และวิธี

ช่องโหว่บัฟเฟอร์ล้น

ฟังก์ชันบางอย่างในไลบรารีมาตรฐาน C ขึ้นชื่อว่ามีช่องโหว่ของบัฟเฟอร์โอเวอร์โฟลว์และโดยทั่วไปแล้วจะสนับสนุนการเขียนโปรแกรมแบบบั๊กกี้ตั้งแต่เริ่มนำมาใช้ [a]รายการที่วิพากษ์วิจารณ์มากที่สุดคือ:

  • รูทีนการจัดการสตริงซึ่งรวมถึงstrcpy()และstrcat()สำหรับการขาดการตรวจสอบขอบเขตและอาจมีบัฟเฟอร์ล้นหากไม่ได้ตรวจสอบขอบเขตด้วยตนเอง
  • รูทีนสตริงโดยทั่วไปสำหรับผลข้างเคียง การสนับสนุนการใช้บัฟเฟอร์ที่ขาดความรับผิดชอบ ไม่รับประกันผลลัพธ์ที่สิ้นสุดด้วยค่า null ที่ถูกต้อง การคำนวณความยาวเชิงเส้น [NS]
  • printf()ตระกูลของรูทีนสำหรับการทำลายสแต็กการดำเนินการเมื่อสตริงรูปแบบไม่ตรงกับอาร์กิวเมนต์ที่กำหนด ข้อบกพร่องพื้นฐานนี้สร้างการโจมตีทั้งคลาส: การโจมตีแบบสตริงรูปแบบ ;
  • gets()และscanf()ครอบครัวของรูทีน I/O เนื่องจากขาดการตรวจสอบความยาวอินพุต (ไม่ว่าจะแบบใดแบบหนึ่งหรือแบบง่าย)

ยกเว้นกรณีร้ายแรงที่มีgets()ช่องโหว่ด้านความปลอดภัยทั้งหมดสามารถหลีกเลี่ยงได้โดยการแนะนำโค้ดเสริมเพื่อดำเนินการจัดการหน่วยความจำ การตรวจสอบขอบเขต การตรวจสอบอินพุต ฯลฯ ซึ่งมักจะทำในรูปแบบของ wrappers ที่ทำให้ฟังก์ชันไลบรารีมาตรฐานปลอดภัยและใช้งานง่ายขึ้น หนังสือนี้มีอายุย้อนไปถึงช่วงต้นของหนังสือThe Practice of Programmingโดย B. Kernighan และ R. Pike ซึ่งผู้เขียนมักใช้ wrapper ที่พิมพ์ข้อความแสดงข้อผิดพลาดและออกจากโปรแกรมหากเกิดข้อผิดพลาดขึ้น

คณะกรรมการ ISO C ได้เผยแพร่รายงานทางเทคนิค TR 24731-1 [12]และกำลังดำเนินการเกี่ยวกับ TR 24731-2 [13]เพื่อเสนอการนำฟังก์ชันบางอย่างมาใช้ด้วยการตรวจสอบขอบเขตและการจัดสรรบัฟเฟอร์อัตโนมัติตามลำดับ อดีตได้รับการวิพากษ์วิจารณ์อย่างรุนแรงด้วยการยกย่อง[14] [15]หลังได้รับการตอบรับที่หลากหลาย อย่างไรก็ตาม มีการนำ TR 24731-1 ไปใช้ในไลบรารีมาตรฐาน C ของ Microsoft และคอมไพเลอร์จะส่งคำเตือนเมื่อใช้ฟังก์ชัน "ไม่ปลอดภัย" แบบเก่า

ปัญหาการร้อยด้าย ความเปราะบางต่อสภาพการแข่งขัน

strerror()ประจำถูกวิพากษ์วิจารณ์ว่าเป็นกระทู้ที่ไม่ปลอดภัยและอื่น ๆ ที่เสี่ยงต่อการสภาพการแข่งขัน

ข้อผิดพลาดในการจัดการ

การจัดการข้อผิดพลาดของฟังก์ชันในไลบรารีมาตรฐาน C ไม่สอดคล้องกันและบางครั้งทำให้เกิดความสับสน ตามหน้าคู่มือของ Linux math_error"สถานการณ์ปัจจุบัน (เวอร์ชัน 2.8) ภายใต้ glibc นั้นยุ่งเหยิง ฟังก์ชันส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด) ทำให้เกิดข้อยกเว้นในข้อผิดพลาด บางฟังก์ชันก็ตั้งค่าerrnoด้วย ฟังก์ชันบางอย่างตั้งค่าerrnoแต่อย่ายกข้อยกเว้น . ฟังก์ชันน้อยมากไม่ทำอย่างนั้น " [16]

การทำให้เป็นมาตรฐาน

ต้นฉบับภาษา Cให้ไม่มีฟังก์ชั่นเช่น I / O การดำเนินงานแตกต่างจากภาษาดั้งเดิมเช่นภาษาโคบอลและFortran [ อ้างอิงจำเป็น ]เมื่อเวลาผ่านไป ชุมชนผู้ใช้ของ C ได้แบ่งปันแนวคิดและการนำสิ่งที่เรียกว่าห้องสมุดมาตรฐาน C ไปใช้ในปัจจุบัน แนวคิดเหล่านี้จำนวนมากถูกรวมเข้ากับคำจำกัดความของภาษาซีมาตรฐานในที่สุด

ทั้งUnixและ C ถูกสร้างขึ้นที่Bell Laboratories ของ AT&Tในช่วงปลายทศวรรษ 1960 และต้นทศวรรษ 1970 ในช่วงปี 1970 ภาษา C เริ่มเป็นที่นิยมมากขึ้น มหาวิทยาลัยและองค์กรหลายแห่งเริ่มสร้างความแตกต่างของภาษาสำหรับโครงการของตนเอง ในช่วงต้นทศวรรษ 1980 ปัญหาความเข้ากันได้ระหว่างการใช้งาน C ต่างๆ ได้ชัดเจนขึ้น ในปี 1983 American National Standards Institute (ANSI) ได้จัดตั้งคณะกรรมการเพื่อจัดตั้งข้อกำหนดมาตรฐานของ C ที่เรียกว่า " ANSI C " งานนี้มีผลสูงสุดในการสร้างมาตรฐานที่เรียกว่า C89 ในปี 1989 ส่วนหนึ่งของมาตรฐานที่ได้คือชุดของไลบรารีซอฟต์แวร์ที่เรียกว่าไลบรารีมาตรฐาน ANSI C

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

POSIXและSUSระบุจำนวนรูทีนที่ควรพร้อมใช้งานมากกว่าและเหนือกว่ารูทีนในไลบรารีมาตรฐาน C พื้นฐาน ข้อกำหนด POSIX รวมถึงไฟล์ส่วนหัวสำหรับหมู่หมายอื่นแบบมัลติเธรด , ระบบเครือข่ายและการแสดงออกปกติ สิ่งเหล่านี้มักถูกนำไปใช้ควบคู่ไปกับการทำงานของไลบรารีมาตรฐาน C โดยมีระดับความใกล้ชิดที่แตกต่างกัน ตัวอย่างเช่นglibcใช้ฟังก์ชันเช่นforkwithin libc.soแต่ก่อนNPTLถูกรวมเข้ากับ glibc มันประกอบด้วยไลบรารีแยกต่างหากที่มีอาร์กิวเมนต์แฟล็กลิงเกอร์ของตัวเอง บ่อยครั้ง ฟังก์ชันที่ระบุ POSIX นี้จะถือเป็นส่วนหนึ่งของไลบรารี ไลบรารี C พื้นฐานอาจถูกระบุเป็นไลบรารี ANSI หรือISO C

BSD libc

BSD libcเป็น superset ของห้องสมุดมาตรฐาน POSIX สนับสนุนโดยห้องสมุด C ที่มาพร้อมกับBSD ระบบปฏิบัติการเช่นFreeBSD , NetBSD , OpenBSDและMacOS BSD libc มีส่วนขยายบางอย่างที่ไม่ได้กำหนดไว้ในมาตรฐานดั้งเดิม ซึ่งส่วนใหญ่ปรากฏขึ้นครั้งแรกในรุ่น4.4BSDของปี 1994 (ส่วนแรกที่มีการพัฒนาเป็นส่วนใหญ่หลังจากออกมาตรฐานแรกในปี 1989) ส่วนขยายบางส่วนของ BSD libc คือ:

  • sys/tree.h – มีการดำเนินการของต้นไม้สีแดง – ดำและต้นไม้กระจาย[17] [18]
  • sys/queue.h – การใช้งานLinked list , queues , tail queueเป็นต้น[19] [20]
  • fgetln() - กำหนดไว้ในstdio.h. สามารถใช้อ่านไฟล์ทีละบรรทัด [21] [22] [23]
  • fts.h – มีฟังก์ชันบางอย่างเพื่อสำรวจลำดับชั้นของไฟล์[24] [25]
  • db.h – ฟังก์ชั่นบางอย่างเพื่อเชื่อมต่อกับBerkeley DB [26] [27]
  • strlcat()และstrlcpy() – ทางเลือกที่ปลอดภัยสำหรับstrncat()และstrncpy()[28] [29] [30] [31] [32]
  • err.h – มีฟังก์ชันบางอย่างในการพิมพ์ข้อความแสดงข้อผิดพลาดที่จัดรูปแบบไว้[33] [34]
  • vis.h - ประกอบด้วยvis()ฟังก์ชัน ฟังก์ชันนี้ใช้เพื่อแสดงอักขระที่ไม่สามารถพิมพ์ได้ในรูปแบบภาพ [35] [36] [37]

ห้องสมุดมาตรฐาน C ในภาษาอื่น ๆ

บางภาษามีฟังก์ชันของไลบรารี C มาตรฐานในไลบรารีของตนเอง ห้องสมุดอาจถูกปรับให้เหมาะสมกับโครงสร้างของภาษามากขึ้น แต่ความหมายในการปฏิบัติงานยังคงคล้ายกันC ++ภาษาเช่นมีฟังก์ชันการทำงานของไลบรารีมาตรฐาน C ในnamespace std (เช่นstd::printf, std::atoi, std::feof) ในไฟล์ส่วนหัวที่มีชื่อคล้ายกับคนที่ C ( cstdio, cmath, cstdlibฯลฯ ) ภาษาอื่นที่ใช้แนวทางที่คล้ายคลึงกันคือD , Perl , Rubyและการใช้งานหลักของPython ที่รู้จักกันในชื่อCPython. ตัวอย่างเช่น ใน Python 2 อ็อบเจ็กต์ไฟล์ในตัวถูกกำหนดเป็น "ดำเนินการโดยใช้stdioแพ็คเกจของ C " [38]เพื่อให้การดำเนินการที่มีอยู่ (เปิด อ่าน เขียน ฯลฯ ) คาดว่าจะมีพฤติกรรมเช่นเดียวกับ ฟังก์ชัน C ที่สอดคล้องกัน Rustมีลังที่เรียกว่าlibcซึ่งอนุญาตให้ใช้ฟังก์ชัน C, struct และคำจำกัดความประเภทอื่น ๆ ได้หลายอย่าง [39]

เปรียบเทียบกับไลบรารีมาตรฐานของภาษาอื่น ๆ

ไลบรารีมาตรฐาน C มีขนาดเล็กเมื่อเทียบกับไลบรารีมาตรฐานของภาษาอื่นๆ ไลบรารี C มีชุดพื้นฐานของฟังก์ชันทางคณิตศาสตร์ การจัดการสตริงการแปลงประเภทและ I/O แบบไฟล์และคอนโซล ไม่รวมชุดมาตรฐานของ " ประเภทคอนเทนเนอร์ " เช่นC++ Standard Template Libraryนับประสาชุดเครื่องมืออินเทอร์เฟซผู้ใช้แบบกราฟิก (GUI) ที่สมบูรณ์ เครื่องมือเครือข่าย และฟังก์ชันอื่นๆ มากมายที่Javaและ.NET Frameworkให้เป็นมาตรฐาน ข้อได้เปรียบหลักของไลบรารีมาตรฐานขนาดเล็กคือการจัดเตรียมสภาพแวดล้อม ISO C ที่ใช้งานได้ง่ายกว่าภาษาอื่นๆ อย่างมาก และด้วยเหตุนี้ การย้าย C ไปยังแพลตฟอร์มใหม่จึงค่อนข้างง่าย

ดูเพิ่มเติม

หมายเหตุ

  1. เวิร์มมอร์ริสที่ใช้ประโยชน์จากจุดอ่อนที่เป็นที่รู้จักกันดีgets()นั้นถูกสร้างขึ้นมาตั้งแต่ปี 1988
  2. ^ ในไลบรารีมาตรฐาน C การคำนวณความยาวสตริงและการค้นหาจุดสิ้นสุดของสตริงมีความซับซ้อนของเวลาเชิงเส้นและไม่มีประสิทธิภาพเมื่อใช้กับสตริงเดียวกันหรือที่เกี่ยวข้องซ้ำ ๆ

อ้างอิง

  1. ^ ISO / IEC (2018). ISO/IEC 9899:2018(E): ภาษาการเขียนโปรแกรม - C §7
  2. ^ "ห้องสมุด GNU C – บทนำ" . gnu.org . ดึงข้อมูลเมื่อ2013-12-05 .
  3. ^ "ความแตกต่างระหว่างมาตรฐานห้องสมุด C และห้องสมุด C POSIX" stackoverflow.comครับ 2555 . สืบค้นเมื่อ2015-03-04 .
  4. ^ "มาตรฐานซี" . คีล. สืบค้นเมื่อ24 พฤศจิกายน 2554 .
  5. ^ "Re: Newlib รองรับซีพียูแบบ mmu-less หรือไม่" . Cygwin.com 23 มีนาคม 2549. เก็บถาวรจากต้นฉบับเมื่อ 22 พฤศจิกายน 2551 . สืบค้นเมื่อ28 ตุลาคม 2011 .
  6. ^ "musl libc" . Etalabs.net . สืบค้นเมื่อ28 ตุลาคม 2011 .
  7. ^ ฟังก์ชั่นในตัวอื่น ๆ ที่จัดทำโดย GCC , GCC Manual
  8. ^ "กำลังคอมไพล์ด้วยซีซี" . ที่ดึง 2013/03/02
  9. ^ ไวเมอร์, ฟลอเรียน. "c - libm ทำหน้าที่อะไร" . กองมากเกิน สืบค้นเมื่อ24 กุมภาพันธ์ 2021 .
  10. ^ "c99 - คอมไพล์โปรแกรม C มาตรฐาน" . The Open Group Base Specifications Issue 7, 2018 edition . กลุ่มเปิด. สืบค้นเมื่อ24 กุมภาพันธ์ 2021 .
  11. ^ "คำถามที่พบบ่อยของชาวมุสลิม" . www.musl-libc.org ครับ สืบค้นเมื่อ24 กุมภาพันธ์ 2021 .
  12. ^ "มาตรฐาน ISO / IEC 24731-1 TR: ส่วนขยายไปยัง C Library, Part I: ขอบเขตการตรวจสอบการเชื่อมต่อ" (PDF) open-std.org 2007-03-28 . สืบค้นเมื่อ2014-03-13 .
  13. ^ "มาตรฐาน ISO / IEC 24731-2 WDTR: ส่วนขยายที่ห้องสมุด C, Part II: ไดนามิคฟังก์ชั่นการจัดสรร" (PDF) open-std.org 2008-08-10 . สืบค้นเมื่อ2014-03-13 .
  14. ^ คุณใช้ฟังก์ชัน 'ปลอดภัย' ของ TR 24731 ในรหัส C ของคุณหรือไม่ - กองล้น
  15. ^ "Austin Group Review of ISO/IEC WDTR 24731" . สืบค้นเมื่อ28 ตุลาคม 2011 .
  16. ^ "math_error - การตรวจสอบข้อผิดพลาดจากฟังก์ชั่นทางคณิตศาสตร์" man7.org . 2008-08-11 . สืบค้นเมื่อ2014-03-13 .
  17. ^ "ต้นไม้" . คน . freebsd.org 2550-12-27 . สืบค้นเมื่อ2013-08-25 .
  18. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/sys/sys/tree.h" bxr.su .
  19. ^ "คิว" . คน . freebsd.org 2011-05-13 . สืบค้นเมื่อ2013-08-25 .
  20. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/sys/sys/queue.h" bxr.su .
  21. ^ "fgetln" . คน . freebsd.org 1994-04-19 . สืบค้นเมื่อ2013-08-25 .
  22. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/lib/libc/stdio/fgetln.c" bxr.su .
  23. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/include/stdio.h" bxr.su .
  24. ^ "ฟุต" . คน . freebsd.org 2012-03-18 . สืบค้นเมื่อ2013-08-25 .
  25. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/include/fts.h" bxr.su .
  26. ^ "ดีบี" . คน . freebsd.org 2010-09-10 . สืบค้นเมื่อ2013-08-25 .
  27. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/include/db.h" bxr.su .
  28. มิลเลอร์, ทอดด์ ซี. และธีโอ เดอ ราดต์ strlcpy และ strlcat - สอดคล้องปลอดภัยสำเนาสตริงและเรียงต่อกัน Proceedings of the 1999 USENIX Annual Technical Conference, 6-11 มิถุนายน 1999, หน้า 175–178.
  29. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/lib/libc/string/strlcat.c" bxr.su .
  30. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/lib/libc/string/strlcpy.c" bxr.su .
  31. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/lib/libc/string/strncat.c" bxr.su .
  32. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/lib/libc/string/strncpy.c" bxr.su .
  33. ^ "ผิดพลาด" . คน . freebsd.org 2012-03-29 . สืบค้นเมื่อ2013-08-25 .
  34. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/include/err.h" bxr.su .
  35. ^ "เห็น(3)" . ผู้ชาย. FreeBSD.org สืบค้นเมื่อ14 กันยายน 2556 .
  36. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/lib/libc/gen/vis.c" bxr.su .
  37. ^ "ซูเปอร์ผู้ใช้ BSD ข้ามอ้างอิง: /OpenBSD/include/vis.h" bxr.su .
  38. ^ "ไลบรารีมาตรฐาน Python: 6.9. File Objects" . เอกสาร. python.org สืบค้นเมื่อ28 ตุลาคม 2011 .
  39. ^ "libc" . ลังสนิม . เก็บถาวรจากต้นฉบับเมื่อ 18 สิงหาคม 2016 . สืบค้นเมื่อ31 กรกฎาคม 2559 .

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

ลิงค์ภายนอก