مكتبة C القياسية
مكتبة C القياسية ، والتي يُشار إليها أحيانًا باسم libc ، [ 1 ] هي المكتبة القياسية للغة البرمجة C ، كما هو مُحدد في معيار ISO C. [ 2 ] انطلاقًا من معيار ANSI C الأصلي ، تم تطويرها في نفس وقت تطوير مكتبة C POSIX ، التي تُعد مجموعة فرعية منه. [ 3 ] منذ أن اعتمدت المنظمة الدولية للتوحيد القياسي معيار ANSI C ، [ 4 ] تُسمى مكتبة C القياسية أيضًا مكتبة ISO C. [ 5 ]
توفر مكتبة C القياسية وحدات الماكرو وتعريفات الأنواع والوظائف لمهام مثل معالجة السلاسل والحسابات الرياضية ومعالجة الإدخال/الإخراج وإدارة الذاكرة والإدخال /الإخراج .
واجهة برمجة التطبيقات (API)
ملفات الرأس
يتم تعريف واجهة برمجة التطبيقات (API) الخاصة بمكتبة C القياسية في عدد من ملفات الرأس . يحتوي كل ملف رأس على تعريف واحد أو أكثر للدوال، وتعريفات أنواع البيانات، ووحدات الماكرو.
يمكن وصف تطبيق إصدار من معيار لغة C بأنه مُستضاف أو مستقل . يدعم التطبيق المُستضاف المعيار بالكامل، ويتطلب وجود جميع ملفات الرأس المحددة فيه؛ وعادةً ما تكون هذه التطبيقات مخصصة للبرامج التي تعمل على نظام تشغيل. أما التطبيق المستقل، فلا يُشترط فيه تنفيذ ميزات اللغة في مكتبة C باستثناء تلك المحددة في إصدار نظام التشغيل المطلوب للتطبيقات المستقلة؛ وعادةً ما تكون هذه التطبيقات مخصصة للبرامج التي تعمل على نظام تشغيل محدود الإمكانيات أو مباشرةً على الجهاز.
بعد فترة طويلة من الاستقرار، أُضيفت ثلاثة ملفات رأسية جديدة ( <iso646.h>، <wchar.h>و، و ) مع الملحق المعياري 1 (NA1)، وهو إضافة إلى معيار C تم التصديق عليه في عام 1995. كما أُضيفت ستة ملفات رأسية أخرى ( ، و، و ، و، و ) مع C99 ، وهو تنقيح لمعيار C نُشر في عام 1999، وخمسة ملفات أخرى ( ، و، و ، و ) مع C11 في عام 2011، وملفان آخران ( و ) مع C23 في عام 2023. وبذلك، أصبح المجموع الآن 31 ملفًا رأسيًا.<wctype.h><complex.h><fenv.h><inttypes.h><stdbool.h><stdint.h><tgmath.h><stdalign.h><stdatomic.h><stdnoreturn.h><threads.h><uchar.h><stdbit.h><stdckdint.h>
مفتاح الرموز: : مهمل : تمت إزالته
| اسم | من | وصف |
|---|---|---|
<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 | للاستعلام عن الكائنات وتحديد محاذاتها . تم إيقاف استخدامها في الإصدار C23 نظرًا لأنها alignasأصبحت من alignofالميزات الأساسية للغة. |
<stdarg.h> | للوصول إلى عدد متغير من الوسائط التي يتم تمريرها إلى الدوال. | |
<stdatomic.h> | C11 | لإجراء عمليات ذرية على البيانات المشتركة بين الخيوط. |
<stdbit.h> | C23 | لترتيب البايتات وتمثيل البتات. |
<stdbool.h> | C99 | يُعرّف نوع بيانات منطقي . تم إيقاف استخدامه في C23 لأنه boolأصبح ميزة أساسية في اللغة. |
<stdckdint.h> | C23 | يُعرّف وحدات الماكرو الخاصة بالحسابات الصحيحة المُدققة. |
<stdcountof.h> | C29 | للحصول على طول المصفوفة باستخدام countof(). |
<stddef.h> | يُعرّف العديد من الأنواع والوحدات البرمجية المفيدة . | |
<stdint.h> | C99 | يُعرّف أنواع الأعداد الصحيحة ذات العرض المحدد . |
<stdio.h> | يحدد وظائف الإدخال والإخراج الأساسية | |
<stdlib.h> | يُعرّف هذا البرنامج وظائف التحويل العددي ، ووظائف توليد الأرقام شبه العشوائية ، وتخصيص الذاكرة ، ووظائف التحكم في العمليات. | |
<stdmchar.h> | C29 | يوفر أدوات تحويل ترميز النصوص. |
<stdnoreturn.h> | C11 | لتحديد الدوال التي لا تُرجع قيمة. تم إيقاف استخدامها في الإصدار C23 بسبب إضافة السمة [[noreturn]]. |
<string.h> | يُعرّف وظائف معالجة السلاسل النصية | |
<tgmath.h> | C99 | يُعرّف الدوال الرياضية العامة . |
<threads.h> | C11 | يُعرّف هذا الملف وظائف لإدارة الخيوط المتعددة ، والأقفال المتبادلة ، ومتغيرات الحالة. |
<time.h> | يُعرّف وظائف معالجة التاريخ والوقت | |
<uchar.h> | C11 | أنواع ووظائف لمعالجة أحرف يونيكود |
<wchar.h> | NA1 | يُعرّف وظائف معالجة السلاسل العريضة |
<wctype.h> | NA1 | يُعرّف هذا البرنامج مجموعة من الدوال المستخدمة لتصنيف الأحرف العريضة حسب أنواعها أو للتحويل بين الأحرف الكبيرة والصغيرة. |
ثلاثة من ملفات الرأس ( <complex.h>، <stdatomic.h>و، و <threads.h>) هي ميزات مشروطة لا يُطلب من التطبيقات دعمها.
أضاف معيار POSIX العديد من ملفات رأس C غير القياسية لوظائف خاصة بنظام Unix. وقد شقّ الكثير منها طريقه إلى بنى معمارية أخرى. ومن الأمثلة على ذلك `<header>` و` < header>`. كما تستخدم مجموعات أخرى ملفات رأس غير قياسية أخرى، مثل مكتبة GNU C التي تحتوي على `<header>`، ونظام OpenVMS الذي يحتوي على الدالة `<header>`.<fcntl.h><unistd.h><alloca.h>va_count()
الوثائق
في الأنظمة الشبيهة بنظام يونكس، تُقدَّم الوثائق الرسمية لواجهة برمجة التطبيقات (API) على شكل صفحات دليل (man pages ). في معظم الأنظمة، توجد صفحات الدليل الخاصة بوظائف المكتبة القياسية في القسم 3؛ وقد يحتوي القسم 7 على بعض الصفحات العامة حول المفاهيم الأساسية (كما هو الحال man 7 math_errorفي نظام لينكس ).
التطبيقات
تحتوي الأنظمة الشبيهة بنظام يونكس عادةً على مكتبة C بصيغة مكتبة مشتركة ، ولكن قد تغيب ملفات الرأس (ومجموعة أدوات المُصرّف) عن التثبيت، مما قد يُعيق تطوير البرامج بلغة C. تُعتبر مكتبة C جزءًا من نظام التشغيل في الأنظمة الشبيهة بنظام يونكس؛ فبالإضافة إلى الدوال المُحددة في معيار C، تتضمن دوالًا أخرى تُشكّل جزءًا من واجهة برمجة تطبيقات نظام التشغيل، مثل الدوال المُحددة في معيار POSIX . تُستخدم دوال مكتبة C، بما فيها دوال معيار ISO C، على نطاق واسع في البرامج، وتُعتبر بمثابة تطبيق لشيء ما في لغة C، وجزءًا فعليًا من واجهة نظام التشغيل. لا يُمكن لأنظمة التشغيل الشبيهة بنظام يونكس العمل عمومًا في حال حذف مكتبة C. ينطبق هذا على التطبيقات المرتبطة ديناميكيًا، وليس ثابتًا. علاوة على ذلك، تعمل النواة نفسها (على الأقل في حالة لينكس) بشكل مستقل عن أي مكتبات.
في نظام التشغيل مايكروسوفت ويندوز، توفر مكتبة وقت تشغيل لغة C من مايكروسوفت تطبيقًا لمكتبة C القياسية لمترجم مايكروسوفت فيجوال سي++ الإصدار 6.0؛ أما مكتبة C القياسية للإصدارات الأحدث من مترجم مايكروسوفت فيجوال سي++، فيوفرها كل مترجم على حدة، بالإضافة إلى الحزم القابلة لإعادة التوزيع . تُربط التطبيقات المُترجمة المكتوبة بلغة C إما بشكل ثابت بمكتبة C، أو بنسخة ديناميكية من المكتبة المرفقة مع هذه التطبيقات، بدلاً من الاعتماد على وجودها في الأنظمة المستهدفة. لا تُعتبر الدوال الموجودة في مكتبة C الخاصة بالمترجم واجهات لنظام التشغيل مايكروسوفت ويندوز؛ إذ تُوفر واجهات نظام ويندوز في مكتبات منفصلة عن مكتبة وقت تشغيل لغة C.
تتوفر العديد من تطبيقات مكتبة C القياسية، وهي متوفرة مع أنظمة تشغيل ومترجمات C المختلفة. ومن بين التطبيقات الشائعة ما يلي:
- مكتبة BSD libc ، وتطبيقات متنوعة موزعة مع أنظمة التشغيل المشتقة من BSD
- مكتبة GNU C (glibc)، المستخدمة في GNU Hurd و GNU/kFreeBSD ومعظم توزيعات Linux
- مكتبة وقت تشغيل لغة C من مايكروسوفت، وهي جزء من مايكروسوفت فيجوال سي++ . يوجد إصداران من المكتبة: الإصدار MSVCRT الذي كان يُعاد توزيعه سابقًا (حتى إصدار فيجوال ستوديو 2013) وهو غير متوافق مع معيار C99 ، والإصدار الأحدث UCRT (وقت تشغيل لغة C العالمي) الذي يأتي مع نظامي التشغيل ويندوز 10 و11 وهو متوافق مع معيار C99..
- dietlibc ، تطبيق بديل صغير لمكتبة C القياسية (بدون وحدة إدارة الذاكرة)
- μClibc ، مكتبة C قياسية لأنظمة μClinux المدمجة (بدون وحدة إدارة الذاكرة)
- مكتبة uclibc-ng ، وهي مكتبة C مضمنة، نسخة معدلة من μClibc، لا تزال قيد الصيانة، مع دعم وحدة إدارة الذاكرة (MMU).
- Newlib ، مكتبة قياسية مكتوبة بلغة C للأنظمة المدمجة (بدون وحدة إدارة الذاكرة) [ 6 ] ، وتُستخدم في توزيعة Cygwin GNU لنظام التشغيل Windows
- مكتبة klibc ، وهي مخصصة بشكل أساسي لتشغيل أنظمة لينكس
- musl ، وهو تطبيق آخر خفيف الوزن لمكتبة C القياسية لأنظمة Linux [ 7 ]
- بايونيك ، الذي طورته جوجل في الأصل لنظام التشغيل أندرويد المدمج، مشتق من مكتبة بي إس دي libc
- مكتبة picolibc ، التي طورها كيث باكارد ، تستهدف الأنظمة المدمجة الصغيرة ذات ذاكرة الوصول العشوائي المحدودة، وهي مبنية على كود من مكتبتي Newlib و AVR Libc.
- llvm-libc عبارة عن تطبيق من الصفر لمكتبة C القياسية، تم بناؤها كجزء من مشروع LLVM
وظائف مدمجة في المترجم
تُوفّر بعض المُترجمات (مثل GCC [ 8 ] ) نسخًا مُدمجة من العديد من الدوال في مكتبة C القياسية؛ أي أن تطبيقات هذه الدوال تُكتب في ملف الكائن المُترجم ، ويستدعي البرنامج النسخ المُدمجة بدلًا من الدوال الموجودة في ملف الكائن المُشترك لمكتبة C. يُقلّل هذا من عبء استدعاء الدوال، خاصةً إذا استُبدلت استدعاءات الدوال بنسخ مُضمّنة ، ويُتيح أشكالًا أخرى من التحسين (حيث يعرف المُترجم خصائص تدفق التحكم للنسخ المُدمجة)، ولكنه قد يُسبّب ارتباكًا عند تصحيح الأخطاء (على سبيل المثال، لا يُمكن استبدال النسخ المُدمجة بنسخ مُعدّلة ).
مع ذلك، يجب أن تتصرف الدوال المدمجة كدوال عادية وفقًا لمعيار ISO C. ويعني هذا بالضرورة أن البرنامج يجب أن يكون قادرًا على إنشاء مؤشر لهذه الدوال من خلال الحصول على عنوانها، واستدعاء الدالة باستخدام هذا المؤشر. إذا تم اشتقاق مؤشرين لنفس الدالة في وحدتي ترجمة مختلفتين في البرنامج، فيجب أن يكون هذان المؤشران متطابقين؛ أي أن العنوان يُستخلص من اسم الدالة، التي لها ارتباط خارجي (على مستوى البرنامج).
الربط، libm
في نظام FreeBSD [ 9 ] ومكتبة glibc [ 10 ] ، لا يتم ربط بعض الدوال sin()افتراضيًا، بل تُضمّن في مكتبة الرياضيات libm . عند استخدام أي منها، يجب توجيه الرابط إلى -lm. يشترط معيار POSIX أن يدعم مُصرّف c99 -lm، وأن تكون الدوال المُعلنة في ملفات الرأس <math.h>، <complex.h>و ، و <fenv.h>متاحة للربط إذا -lmتم تحديد ، ولكنه لا يُحدد ما إذا كانت هذه الدوال مرتبطة افتراضيًا. [ 11 ] يُلبي musl هذا الشرط بوضع كل شيء في مكتبة libc واحدة وتوفير مكتبة libm فارغة. [ 12 ]
كشف
__STDC_HOSTED__وفقًا لمعيار لغة C ، يجب تعريف الماكرو على النحو التالي 1إذا كان التطبيق مُستضافًا. يحتوي التطبيق المُستضاف على جميع ملفات الرأس المحددة في معيار C. يمكن أن يكون التطبيق أيضًا مُستقلًا، مما يعني أنه لا يُضمن وجود سوى ملفات الرأس المطلوبة لتكون جزءًا من تطبيق مُستقل للمعيار. إذا كان التطبيق مُستقلًا ، فيجب عليه تعريف الماكرو __STDC_HOSTED__على النحو التالي 0.
المشاكل والحلول البديلة
ثغرات تجاوز سعة المخزن المؤقت
اشتهرت بعض الدوال في مكتبة لغة C القياسية بثغرات أمنية خطيرة تتعلق بتجاوز سعة المخزن المؤقت ، مما شجع على البرمجة المعيبة منذ اعتمادها. [ 13 ] [ أ ] ومن أكثر العناصر التي تعرضت للانتقاد:
- إجراءات معالجة السلاسل ، بما في ذلك
strcpy()وstrcat()، بسبب عدم وجود فحص للحدود واحتمالية حدوث تجاوزات في المخزن المؤقت إذا لم يتم فحص الحدود يدويًا؛ - إجراءات السلاسل بشكل عام، للآثار الجانبية ، وتشجيع استخدام المخزن المؤقت بشكل غير مسؤول، وعدم ضمان إخراج صالح منتهٍ بـ null دائمًا ، وحساب الطول الخطي؛ [ ب ]
printf()مجموعة من الإجراءات، لإفساد مكدس التنفيذ عندما لا تتطابق سلسلة التنسيق مع الوسائط المعطاة. وقد أدى هذا الخلل الأساسي إلى ظهور فئة كاملة من الهجمات: هجمات سلسلة التنسيق ؛gets()ومجموعةscanf()من إجراءات الإدخال/الإخراج، لعدم وجود فحص لطول الإدخال (سواء كان ذلك أي فحص أو فحص سهل).
باستثناء الحالة القصوى gets()، يمكن تجنب جميع الثغرات الأمنية عن طريق إضافة شيفرة مساعدة لإدارة الذاكرة، والتحقق من الحدود، والتحقق من المدخلات، وما إلى ذلك. ويتم ذلك غالبًا باستخدام أغلفة برمجية تجعل وظائف المكتبة القياسية أكثر أمانًا وسهولة في الاستخدام. يعود هذا إلى كتاب "ممارسة البرمجة" لـ ب. كيرنيغان و ر. بايك، حيث يستخدم المؤلفان عادةً أغلفة برمجية تطبع رسائل الخطأ وتنهي البرنامج في حال حدوث خطأ.
نشرت لجنة ISO C التقارير الفنية TR 24731-1 [ 14 ] وتعمل حاليًا على التقرير TR 24731-2 [ 15 ] لاقتراح اعتماد بعض الوظائف مع التحقق من الحدود وتخصيص المخزن المؤقت تلقائيًا، على التوالي. وقد لاقى التقرير الأول انتقادات حادة مع بعض الإشادة، [ 16 ] [ 17 ] بينما حظي التقرير الثاني بردود فعل متباينة.
على الرغم من المخاوف، تم دمج TR 24731-1 في مسار معايير C في ISO/IEC 9899:2011 (C11)، الملحق K ( واجهات فحص الحدود )، وتم تنفيذه تقريبًا في مكتبة وقت تشغيل C/++ (CRT) الخاصة بشركة Microsoft لمنصات Win32 وWin64.
(بشكل افتراضي، تُصدر مُجمّعات لغة C و C++ في Microsoft Visual Studio تحذيرات عند استخدام الدوال القديمة "غير الآمنة". ومع ذلك، فإن تطبيق Microsoft للمعيار TR 24731-1 غير متوافق بشكل طفيف مع كل من TR 24731-1 والملحق K، [ 18 ] لذا من الشائع في المشاريع القابلة للنقل تعطيل هذه التحذيرات أو تجاهلها. ويمكن تعطيلها مباشرةً عن طريق إصدار
#pragma warning(disable : 4996)قبل/حول موقع (مواقع) الاتصال المعنية، أو بشكل غير مباشر عن طريق إصدار
#define _CRT_SECURE_NO_WARNINGS 1قبل تضمين أي عناوين. [ 19 ] يجب أن يكون لخيار سطر الأوامر /D_CRT_NO_SECURE_WARNINGS=1نفس التأثير #define.
مشاكل التزامن، والتعرض لحالات التزامن غير المتوقعة
strerror()يتعرض هذا الروتين لانتقادات لكونه غير آمن من حيث الخيط وعرضة لظروف التزامن .
معالجة الأخطاء
إن معالجة الأخطاء في دوال مكتبة C القياسية غير متسقة، بل ومربكة أحيانًا. وفقًا لصفحة دليل لينكس math_error، "الوضع الحالي (الإصدار 2.8) في مكتبة glibc غير منظم. معظم الدوال (وليس جميعها) تُطلق استثناءات عند حدوث أخطاء. بعضها يُعيّن قيمة errno . قليل من الدوال يُعيّن قيمة errno ، لكنه لا يُطلق استثناءً. وقليل جدًا من الدوال لا يفعل أيًا من الأمرين." [ 20 ]
التقييس
لم توفر لغة C الأصلية وظائف مدمجة مثل عمليات الإدخال والإخراج، على عكس اللغات التقليدية مثل كوبول وفورتران . ومع مرور الوقت، تبادلت مجتمعات مستخدمي لغة C الأفكار والتطبيقات لما يُعرف الآن بمكتبات C القياسية. وقد أُدمجت العديد من هذه الأفكار في نهاية المطاف في تعريف لغة C القياسية.
تم تطوير كل من نظام التشغيل يونكس ولغة البرمجة سي في مختبرات بيل التابعة لشركة AT&T في أواخر الستينيات وأوائل السبعينيات. وخلال السبعينيات، ازدادت شعبية لغة سي بشكل ملحوظ، حيث بدأت العديد من الجامعات والمنظمات في تطوير نسخها الخاصة من اللغة لمشاريعها. وبحلول بداية الثمانينيات، برزت مشاكل التوافق بين مختلف تطبيقات لغة سي. وفي عام 1983، شكّل المعهد الوطني الأمريكي للمعايير (ANSI) لجنة لوضع مواصفات قياسية للغة سي عُرفت باسم " ANSI C ". وتُوّج هذا العمل بإنشاء ما يُعرف بمعيار C89 في عام 1989. وكان من ضمن هذا المعيار مجموعة من مكتبات البرمجيات تُسمى مكتبة ANSI C القياسية.
مكتبات النظام التي توسع مكتبة C
توفر بعض أنظمة التشغيل، مثل الأنظمة الشبيهة بنظام يونكس ، مكتبة نظام تتضمن كلاً من مكتبة C القياسية وواجهات برمجة أخرى خاصة بنظام التشغيل.
مكتبة POSIX القياسية
يُحدد معيار POSIX ومواصفات يونكس الموحدة عددًا من الإجراءات الإضافية إلى جانب تلك الموجودة في مكتبة C القياسية الأساسية. تتضمن مواصفات POSIX ملفات رأسية، من بين أمور أخرى، لخيوط POSIX للبرمجة متعددة الخيوط ، ومآخذ Berkeley للشبكات، والتعبيرات النمطية . غالبًا ما تُنفذ هذه الإجراءات جنبًا إلى جنب مع وظائف مكتبة C القياسية، بدرجات متفاوتة من التقارب. على سبيل المثال، تُنفذ مكتبة glibc وظائف مثل fork`in` libc.so، ولكن قبل دمج مكتبة خيوط POSIX الأصلية في glibc، كانت تُشكل مكتبة منفصلة مع وسيطة ربط خاصة بها. غالبًا ما تُعتبر هذه الوظائف المحددة في POSIX جزءًا من المكتبة؛ ويمكن تعريف مكتبة C الأساسية باسم مكتبة ANSI أو ISO C.
مكتبة بي إس دي سي
مكتبة BSD libc هي مجموعة فرعية من مكتبة POSIX القياسية، وتدعمها مكتبات لغة C المضمنة في أنظمة تشغيل BSD مثل FreeBSD و NetBSD و OpenBSD و macOS . تحتوي مكتبة BSD libc على بعض الإضافات غير المُعرّفة في المعيار الأصلي، وقد ظهر العديد منها لأول مرة في إصدار 4.4BSD عام 1994 (وهو أول إصدار تم تطويره بشكل كبير بعد إصدار المعيار الأول عام 1989). ومن بين إضافات مكتبة BSD libc ما يلي:
<sys/tree.h>– يحتوي على تطبيق لشجرة الأحمر والأسود وشجرة التفرع [ 21 ] [ 22 ]<sys/queue.h>– تطبيقات القوائم المرتبطة ، والطوابير ، وطوابير الذيل ، وما إلى ذلك. [ 23 ] [ 24 ]fgetln()– مُعرّف في<stdio.h>. يمكن استخدام هذا لقراءة ملف سطرًا بسطر. [ 25 ] [ 26 ] [ 27 ]<fts.h>– يحتوي على بعض الوظائف لاجتياز التسلسل الهرمي للملفات [ 28 ] [ 29 ]<db.h>– بعض الوظائف للاتصال بقاعدة بيانات بيركلي [ 30 ] [ 31 ]strlcat()و – بدائل آمنة لـ و [ 32 ] [ 33 ] [ 34 ] [ 35 ] [ 36 ]strlcpy()strncat()strncpy()<err.h>– يحتوي على بعض الوظائف لطباعة رسائل الخطأ المنسقة [ 37 ] [ 38 ]<vis.h>– يحتوي علىvis()الدالة. تُستخدم هذه الدالة لعرض الأحرف غير القابلة للطباعة بتنسيق مرئي. [ 39 ] [ 40 ] [ 41 ]
مكتبة C القياسية في لغات أخرى
تتضمن بعض لغات البرمجة وظائف مكتبة C القياسية ضمن مكتباتها الخاصة. قد يتم تعديل المكتبة لتلائم بنية اللغة بشكل أفضل، ولكن تبقى دلالات التشغيل متشابهة.
لغة سي++
تتضمن لغة C++ معظم بنيات مكتبة C القياسية ضمن بنيتها الخاصة، باستثناء الآليات الخاصة بلغة C. ويتم تصدير وظائف مكتبة C القياسية من مكتبة C++ القياسية بطريقتين.
لتحقيق التوافق مع الإصدارات السابقة/المتقاطعة مع لغة C و C++ قبل المعيار، يمكن الوصول إلى الدوال في مساحة الاسم العامة ( ::)، بعد #includeاستخدام اسم رأس C القياسي كما هو الحال في C. [ 42 ]ومع ذلك، فإن ::استخدام للإشارة إلى مساحة الاسم العامة ضروري فقط عندما يكون ضمن نطاق مساحات أسماء أخرى حيث يتم تعريف نفس اسم الرمز. وبالتالي، فإن برنامج C++98
#include <stdio.h>int main ( void ) { return puts ( "Hello, world!" ) == EOF ; }ينبغي أن يُظهر سلوكًا (ظاهريًا) مطابقًا لبرنامج C95 مطابق له في الكود .
ابتداءً من C++98 ، أصبحت دوال C متاحة أيضًا في نطاق الأسماء std(مثل C printfas C++ std::printfو atoias و std::atoias feof) std::feof، وذلك بتضمين ملف رأس بدلاً من ملف رأس C المقابل . على سبيل المثال، يحل محل و لـ ؛ لاحظ عدم وجود امتداد لأسماء ملفات رأس C++.<chdrname><hdrname.h><cstdio><stdio.h><cmath><math.h>.h
وبالتالي، فإن البرنامج المكافئ (والمفضل عمومًا) المكتوب بلغة C++ ≥ 98 للبرنامجين المذكورين أعلاه هو:
#include <cstdio>int main () { return std :: puts ( "Hello, world" ) == EOF ; }في حالة استخدام C++20 أو أحدث، يمكن استبدالها بـ (ولكن ليس ، لأن الوحدات النمطية لا تصدر وحدات ماكرو، مثل ).#include<cstdio>import<cstdio>;importstd;EOF
يمكن إصدار إعلان أعلى أو داخل لتحديد مساحة الاسم تلقائيًا (بتطبيق البادئة تلقائيًا بشكل أساسي)، على الرغم من أن كتابة بيان يمكن أن تلوث مساحة الاسم العامة برموز غير مرغوب فيها إذا تم استخدامها في النطاق العام لملف رأس . [ 43 ]usingnamespacestd;mainstdstd::using
بعض إصدارات C++≥98 من ملفات رأس C مفقودة؛ على سبيل المثال، C≥11 <stdnoreturn.h>وليس <threads.h>لها نظائر في C++. [ 44 ]
يتم اختزال بعضها إلى عناصر نائبة، مثل (حتى C++20 ) <ciso646>لـ C95 <iso646.h>، حيث يتم عرض جميع وحدات الماكرو المطلوبة ككلمات مفتاحية في C++98. لا يتم دعم البنى النحوية الخاصة بلغة C بشكل عام، حتى لو كان رأسها مدعومًا. [ 45 ]
توجد العديد من ملفات رأس C بشكل أساسي للتوافق مع C++ ، وعادةً ما تكون هذه الملفات شبه فارغة في C++. على سبيل المثال، تتطلب C99-17 فقط<stdbool.h>
#define bool _Bool #define false 0 #define true 1 #define __bool_true_false_are_defined 1لإضفاء طابع التظاهر بدعم الكلمات المفتاحية C++98 boolو falseو trueفي لغة C، يتطلب C++11<stdbool.h> تعريف و <cstdbool>لتحقيق التوافق، ولكنهما يحتاجان فقط إلى تعريف __bool_true_false_are_defined. يُهمل C23 الكلمة المفتاحية القديمة _Boolلصالح الكلمات المفتاحية الجديدة المكافئة لها في C++98 bool، falseو و ، لذا فإن ملفات الرأس trueC≥23 و C++≥11 متطابقة تمامًا. (على وجه الخصوص، لا يتطلب C23 أي ماكرو لـ .)<stdbool.h>cstdbool>__STDC_VERSION_BOOL_H__<stdbool.h>
يُفضّل الوصول إلى دوال مكتبة C عبر مساحة الاسم ::std وأسماء ملفات الرأس C++≥98 كلما أمكن ذلك. ولتشجيع التبني، ألغت C++98 أسماء ملفات الرأس C، لذا من المحتمل أن يؤدي استخدام ملفات رأس التوافق مع C إلى إصدار معالج مسبق صارم للغاية من نوع ما لتشخيص المشكلة. مع ذلك، تُلغي C++23 ( على نحو غير معتاد) هذه الملفات، لذا لا ينبغي أن تُصدر تطبيقات/أوضاع C++ الأحدث أي تنبيهات إلا إذا طُلب منها ذلك تحديدًا. [ 46 ]<*.h>
تضع وحدة المكتبة القياسية C++≥23 std.compatجميع رموز مكتبة C القياسية في مساحة الاسم العامة (على غرار تضمين جميع <*.h>الرؤوس)، بينما stdتترك الوحدة رموز مكتبة C القياسية في stdمساحة الاسم (على غرار تضمين إصدارات C++ من رؤوس C). تتبع لغات أخرى نهجًا مشابهًا، حيث تضع وظائف/روتينات التوافق مع لغة C ضمن مساحة اسم مشتركة؛ وتشمل هذه اللغات D و Perl و Ruby .
بايثون
يتضمن CPython أغلفة لبعض وظائف مكتبة C في مكتبته المشتركة الخاصة، كما أنه يوفر وصولاً مباشراً إلى وظائف ومتغيرات C عبر حزمة ctypes الخاصة به . [ 47 ]
بشكل عام، يحدد بايثون 2.x كائنات الملفات المضمنة على أنها "مُنفذة باستخدام حزمة stdio الخاصة بلغة C"، [ 48 ] ويُشار بشكل متكرر إلى سلوكيات مكتبة C القياسية؛ العمليات المتاحة ( open،،readwriteمن المتوقع أن يكون لها نفس السلوك مثل وظائف C المقابلة ( fopen، fread، fwrite، إلخ).
ومع ذلك، فإن مواصفات بايثون 3 تعتمد بشكل أقل بكثير على تفاصيل لغة C مقارنة ببايثون 2 .
الصدأ
توفر لغة Rustlibc مكتبة crate ، التي تسمح باستخدام وظائف وتعريفات أنواع مختلفة من مكتبة C القياسية (وغيرها). [ 49 ]
زيج
يأتي برنامج Zig مزودًا بمكتبة libc للأهداف المتاحة. [ 50 ]
مقارنة بالمكتبات القياسية للغات الأخرى
تُعدّ مكتبة C القياسية صغيرة الحجم مقارنةً بمكتبات بعض اللغات الأخرى. توفر مكتبة C مجموعة أساسية من الدوال الرياضية، ومعالجة النصوص، وتحويل أنواع البيانات ، والإدخال والإخراج عبر الملفات ووحدة التحكم. وهي لا تتضمن مجموعة قياسية من " أنواع الحاويات / أنواع المجموعات " كما هو الحال في مكتبة قوالب C++ القياسية ، ناهيك عن أدوات واجهة المستخدم الرسومية الكاملة ، وأدوات الشبكات، والعديد من الوظائف الأخرى التي توفرها Java و .NET Framework بشكل قياسي. تكمن الميزة الرئيسية لصغر حجم المكتبة القياسية في سهولة توفير بيئة ISO C عاملة مقارنةً باللغات الأخرى، وبالتالي سهولة نقل C إلى منصة جديدة نسبيًا.
انظر أيضاً
ملحوظات
- ↑ تم ابتكار دودة موريس التي تستغل نقطة الضعف المعروفة
gets() - ↑ في مكتبة C القياسية، يكون حساب طول السلسلة والبحث عن نهايتها ذا تعقيد زمني خطي ، ويكون غير فعال عند استخدامه بشكل متكرر على نفس السلسلة أو سلاسل ذات صلة.
مراجع
- ↑ ويلونز، كريس (11 فبراير 2023). "مراجعتي لمكتبة لغة سي القياسية عمليًا" . تم الاطلاع عليه بتاريخ 29 ديسمبر 2024 .
- ↑ المنظمة الدولية للمقاييس / اللجنة الكهروتقنية الدولية (2018). ISO/IEC 9899:2018(E): لغات البرمجة - C §7
- ↑ "الفرق بين مكتبة C القياسية ومكتبة C POSIX" . stackoverflow.com . 2012. تم الاطلاع عليه في 4 مارس 2015 .
- ↑ "معايير لغة C" . C: معايير لغة C. كيل . تم الاطلاع عليه بتاريخ 24 نوفمبر 2011 .
- ↑ "مكتبة GNU C - مقدمة" . gnu.org . تم الاطلاع عليه بتاريخ 5 ديسمبر 2013 .
- ↑ "ردًا على: هل يدعم Newlib وحدات المعالجة المركزية بدون وحدة إدارة الذاكرة؟" . Cygwin.com. 23 مارس 2006. مؤرشف من الأصل في 22 نوفمبر 2008. تم الاطلاع عليه في 28 أكتوبر 2011 .
- ↑ "musl libc" . Etalabs.net . تم الاطلاع عليه بتاريخ 28 أكتوبر 2011 .
- ↑ مؤسسة البرمجيات الحرة (2024). "6.64 وظائف أخرى مدمجة يوفرها GCC" . دليل جنو . منشور ذاتيًا.
- ↑ "التجميع باستخدام cc" . تم الاطلاع عليه بتاريخ 2 مارس 2013 .
- ↑ وايمر، فلوريان. "ج - ما هي الوظائف التي صُممت مكتبة libm لأجلها؟" . ستاك أوفرفلو . تم الاطلاع عليه بتاريخ 24 فبراير 2021 .
- ↑ "c99 - تجميع برامج C القياسية" . مواصفات المجموعة المفتوحة الأساسية، الإصدار 7، طبعة 2018. المجموعة المفتوحة . تم الاطلاع عليه بتاريخ 24 فبراير 2021 .
- ↑ "أسئلة وأجوبة حول musl" . www.musl-libc.org . تم الاطلاع عليه بتاريخ 24 فبراير 2021 .
- ↑ كوب، مايكل (يوليو 2021). "تجاوز سعة المخزن المؤقت" . TechTarget . تم الاسترجاع في 29 ديسمبر 2024 .
- ↑ "ISO/IEC TR 24731-1: ملحقات مكتبة C، الجزء الأول: واجهات التحقق من الحدود" (ملف PDF) . open-std.org. 28 مارس 2007. تم الاطلاع عليه بتاريخ 13 مارس 2014 .
- ↑ "ISO/IEC WDTR 24731-2: ملحقات مكتبة C، الجزء الثاني: دوال التخصيص الديناميكي" (ملف PDF) . open-std.org. 10 أغسطس 2008. تم الاطلاع عليه بتاريخ 13 مارس 2014 .
- ↑ هل تستخدم الدوال الآمنة المذكورة في معيار TR 24731 في كود C الخاص بك؟ - Stack Overflow
- ↑ "مراجعة مجموعة أوستن لمعيار ISO/IEC WDTR 24731" . تم الاطلاع عليه بتاريخ 28 أكتوبر 2011 .
- ↑ "التجربة الميدانية مع الملحق ك - واجهات فحص الحدود " . تم الاطلاع عليه في 9 أكتوبر 2024 .
- ↑ "ميزات الأمان في CRT - إلغاء تحذيرات الإهمال" . فبراير 2023. تم الاطلاع عليه في 9 أكتوبر 2024 .
- ↑ "math_error - اكتشاف الأخطاء في الدوال الرياضية" . man7.org . 11 أغسطس 2008. تم الاطلاع عليه في 13 مارس 2014 .
- ↑ "شجرة" . Man.freebsd.org . 27 ديسمبر 2007. تم الاطلاع عليه في 25 أغسطس 2013 .
- ↑ "المرجع المتقاطع لـ Super User's BSD: /OpenBSD/sys/sys/tree.h" . bxr.su .
- ↑ "queue" . Man.freebsd.org . 13 مايو 2011. تم الاطلاع عليه بتاريخ 25 أغسطس 2013 .
- ↑ "المرجع المتقاطع لمستخدم Super User لنظام BSD: /OpenBSD/sys/sys/queue.h" . bxr.su .
- ↑ "fgetln" . Man.freebsd.org . 19 أبريل 1994. تم الاطلاع عليه بتاريخ 25 أغسطس 2013 .
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/lib/libc/stdio/fgetln.c" . bxr.su .
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/include/stdio.h" . bxr.su .
- ↑ "fts" . Man.freebsd.org . ١٨ مارس ٢٠١٢. تم الاطلاع عليه بتاريخ ٢٥ أغسطس ٢٠١٣ .
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/include/fts.h" . bxr.su .
- ↑ "db" . Man.freebsd.org . 10 سبتمبر 2010. تم الاطلاع عليه في 25 أغسطس 2013 .
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/include/db.h" . bxr.su .
- ↑ ميلر، تود سي. وثيو دي رادت. strlcpy و strlcat - نسخ ودمج السلاسل النصية بشكل متسق وآمن . وقائع المؤتمر التقني السنوي لـ USENIX لعام 1999، 6-11 يونيو 1999، الصفحات 175-178.
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/lib/libc/string/strlcat.c" . bxr.su .
- ↑ "المرجع المتقاطع لـ Super User's BSD: /OpenBSD/lib/libc/string/strlcpy.c" . bxr.su .
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/lib/libc/string/strncat.c" . bxr.su .
- ↑ "المرجع المتقاطع لـ Super User's BSD: /OpenBSD/lib/libc/string/strncpy.c" . bxr.su .
- ↑ "خطأ" . Man.freebsd.org . 29 مارس 2012. تم الاطلاع عليه في 25 أغسطس 2013 .
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/include/err.h" . bxr.su .
- ↑ "vis(3)" . Man.FreeBSD.org . تم الاطلاع عليه بتاريخ 14 سبتمبر 2013 .
- ↑ "المرجع المتقاطع لـ Super User's BSD: /OpenBSD/lib/libc/gen/vis.c" . bxr.su .
- ↑ "المرجع المتقاطع لنظام BSD الخاص بالمستخدم المتميز: /OpenBSD/include/vis.h" . bxr.su .
- ↑ رؤوس مكتبة C++ القياسية - رؤوس التوافق مع لغة C ، تم استرجاعها في 9 أكتوبر 2024
- ↑ كيراس، ديفيد (15 فبراير 2015). "استخدام "using": كيفية استخدام مساحة الاسم std" (ملف PDF) . منشورات EECS381 . قسم الهندسة الكهربائية وعلوم الحاسوب، جامعة ميشيغان. مؤرشف (PDF) من الأصل في 24 ديسمبر 2022. تم الاطلاع عليه في 9 أكتوبر 2024. قد يؤدي وجود عبارة
واحدة
في ملف رأس واحد ضمن مشروع معقد إلى فوضى في إدارة مساحة الاسم للمشروع بأكمله.
لذا، تجنب استخدام عبارات [ ] في المستوى الأعلى
في ملف الرأس!
using namespace std;using namespace - ↑ "رؤوس مكتبة C++ القياسية - رؤوس C غير المدعومة" . تم الاطلاع عليه في 9 أكتوبر 2024 .
- ↑ "رؤوس مكتبة C++ القياسية - رؤوس C عديمة المعنى" . تم الاطلاع عليه في 9 أكتوبر 2024 .
- ↑ "رؤوس مكتبة C++ القياسية - رؤوس التوافق مع لغة C" . تم الاطلاع عليه بتاريخ 9 أكتوبر 2024 .
- ↑ "ctypes—مكتبة دوال خارجية للغة بايثون" . docs.python.com . تم الاطلاع عليه بتاريخ 9 أكتوبر 2024 .
- ↑ "مكتبة بايثون القياسية، القسم 5.9: كائنات الملفات" . تم الاطلاع عليه بتاريخ 9 أكتوبر 2024.
يتم تنفيذ كائنات الملفات باستخدام حزمة
stdio
الخاصة بلغة C ويمكن إنشاؤها باستخدام الدالة المدمجة
.
open() - ↑ "Crate libc " . Rust Crates . تم الاسترجاع في 9 أكتوبر 2024 .
- ↑ "نظرة عامة على لغة برمجة Zig" . ziglang.org . تم الاطلاع عليه بتاريخ 2025-10-03 .
للمزيد من القراءة
- بلاوجر، بي جيه (1992). مكتبة لغة سي القياسية ( الطبعة الأولى). برنتيس هول. رقم ISBN 978-0131315099.
روابط خارجية
- دليل مرجعي لمكتبة C
- قائمة مفيدة توضح أي العناوين موجودة في أي معيار
- إجراءات وقت التشغيل الشاملة للغة C من مايكروسوفت حسب الفئة على MSDN
- دليل مكتبات لغة C لنظام NetBSD، مؤرشف بتاريخ 23 ديسمبر 2015 على موقع Wayback Machine ، بالإضافة إلى شفرة المصدر الكاملة لمكتبة لغة C.
- صفحات دليل مكتبات لغة C القياسية الأصلية في نظام يونكس
- مكتبة C القياسية
- لغة البرمجة سي
