مكتبة سي القياسية
| مكتبة سي القياسية (libc) |
|---|
| المواضيع العامة |
| عناوين متنوعة |
مكتبة C القياسية ، والتي يشار إليها أحيانًا باسم libc ، [ بحاجة لمصدر ] هي المكتبة القياسية للغة البرمجة C ، كما هو محدد في معيار ISO C. [1] بدءًا من معيار ANSI C الأصلي ، تم تطويرها في نفس وقت مواصفات POSIX لمكتبة C ، والتي تعد مجموعة فرعية منها. [2] [3] منذ اعتماد ANSI C من قبل المنظمة الدولية للمعايير ، [4] تُسمى مكتبة C القياسية أيضًا مكتبة ISO C. [ بحاجة لمصدر ]
توفر مكتبة C القياسية وحدات ماكرو وتعريفات النوع والوظائف لمهام مثل معالجة السلسلة والحسابات الرياضية ومعالجة الإدخال/الإخراج وإدارة الذاكرة والإدخال /الإخراج .
واجهة برمجة التطبيقات (API)
ملفات الرأس
يتم إعلان واجهة برمجة التطبيقات (API) لمكتبة C القياسية في عدد من ملفات الرأس . يحتوي كل ملف رأس على إعلان وظيفة واحد أو أكثر، وتعريفات نوع البيانات، وماكرو.
بعد فترة طويلة من الاستقرار، تمت إضافة ثلاثة ملفات رأسية جديدة ( iso646.h،، wchar.hو ) مع الملحق المعياري 1 (NA1)، وهو إضافة إلى معيار C الذي تم التصديق عليه في عام 1995. تمت إضافة ستة ملفات رأسية أخرى ( ،،،،،، و ) مع C99 ، وهو مراجعة لمعيار C نُشر في عام 1999، وخمسة ملفات أخرى ( ،،،،، و ) مع C11 في عام 2011. وفي المجموع، يوجد الآن 29 ملف رأسية
:wctype.hcomplex.hfenv.hinttypes.hstdbool.hstdint.htgmath.hstdalign.hstdatomic.hstdnoreturn.hthreads.huchar.h
| اسم | من | وصف |
|---|---|---|
<assert.h> |
يعلن عن الماكرو assert ، المستخدم للمساعدة في اكتشاف الأخطاء المنطقية وأنواع أخرى من الأخطاء أثناء تصحيح أخطاء البرنامج. | |
<complex.h> |
سي99 | يعرف مجموعة من الوظائف للتعامل مع الأعداد المركبة . |
<ctype.h> |
يعرف مجموعة من الوظائف المستخدمة لتصنيف الأحرف حسب أنواعها أو للتحويل بين الأحرف الكبيرة والصغيرة بطريقة مستقلة عن مجموعة الأحرف المستخدمة (عادةً ASCII أو أحد امتداداتها، على الرغم من أن التنفيذات التي تستخدم EBCDIC معروفة أيضًا). | |
<errno.h> |
لاختبار رموز الأخطاء التي تم الإبلاغ عنها بواسطة وظائف المكتبة. | |
<fenv.h> |
سي99 | يقوم بتعريف مجموعة من الوظائف للتحكم في بيئة النقطة العائمة . |
<float.h> |
يقوم بتعريف ثوابت الماكرو التي تحدد خصائص محددة للتنفيذ لمكتبة الفاصلة العائمة . | |
<inttypes.h> |
سي99 | يعرف أنواع الأعداد الصحيحة ذات العرض الدقيق . |
<iso646.h> |
نا1 | يحدد العديد من وحدات الماكرو التي تنفذ طرقًا بديلة للتعبير عن العديد من الرموز القياسية. للبرمجة في مجموعات الأحرف المتنوعة ISO 646 . |
<limits.h> |
يقوم بتعريف ثوابت الماكرو التي تحدد خصائص محددة للتنفيذ لأنواع الأعداد الصحيحة. | |
<locale.h> |
تعريف وظائف التوطين . | |
<math.h> |
يعرف الوظائف الرياضية الشائعة . | |
<setjmp.h> |
يعلن وحدات الماكرو setjmpو longjmp، والتي يتم استخدامها للخروج غير المحلي.
| |
<signal.h> |
يعرف وظائف معالجة الإشارة . | |
<stdalign.h> |
ج11 | للاستعلام وتحديد محاذاة الكائنات. |
<stdarg.h> |
للوصول إلى عدد متنوع من الوسائط التي تم تمريرها إلى الوظائف. | |
<stdatomic.h> |
ج11 | للعمليات الذرية على البيانات المشتركة بين الخيوط. |
<stdbool.h> |
سي99 | يعرف نوع البيانات المنطقية . |
<stddef.h> |
يحدد العديد من الأنواع والماكرو المفيدة . | |
<stdint.h> |
سي99 | يعرف أنواع الأعداد الصحيحة ذات العرض الدقيق . |
<stdio.h> |
يحدد وظائف الإدخال والإخراج الأساسية | |
<stdlib.h> |
يحدد وظائف التحويل العددي ، ووظائف توليد الأرقام العشوائية الزائفة ، وتخصيص الذاكرة ، ووظائف التحكم في العملية | |
<stdnoreturn.h> |
ج11 | لتحديد الوظائف غير القابلة للإرجاع |
<string.h> |
تعريف وظائف التعامل مع السلسلة | |
<tgmath.h> |
سي99 | يعرف الدوال الرياضية العامة النوع . |
<threads.h> |
ج11 | يحدد وظائف لإدارة الخيوط المتعددة والمتغيرات الشرطية |
<time.h> |
يحدد وظائف التعامل مع التاريخ والوقت | |
<uchar.h> |
ج11 | أنواع ووظائف معالجة أحرف Unicode |
<wchar.h> |
نا1 | يحدد وظائف التعامل مع السلسلة العريضة |
<wctype.h> |
نا1 | يحدد مجموعة من الوظائف المستخدمة لتصنيف الأحرف العريضة حسب أنواعها أو للتحويل بين الأحرف الكبيرة والصغيرة |
ثلاثة من ملفات الرأس ( complex.h،، stdatomic.hو threads.h) هي ميزات شرطية لا يلزم التنفيذات بدعمها.
أضاف معيار POSIX العديد من رؤوس C غير القياسية لوظائف محددة لنظام Unix. وقد وجد العديد منها طريقه إلى بنيات أخرى. تشمل الأمثلة fcntl.hو unistd.h. يستخدم عدد من المجموعات الأخرى رؤوسًا غير قياسية أخرى - مكتبة GNU C لديها alloca.h، و OpenVMS لديه va_count()الوظيفة.
التوثيق
في الأنظمة الشبيهة بنظام يونكس، يتم توفير الوثائق الرسمية لواجهة برمجة التطبيقات في شكل صفحات دليل . في معظم الأنظمة، توجد صفحات الدليل الخاصة بوظائف المكتبة القياسية في القسم 3؛ وقد يحتوي القسم 7 على بعض الصفحات الأكثر عمومية حول المفاهيم الأساسية (على سبيل المثال man 7 math_errorفي لينكس ).
التنفيذات
تحتوي الأنظمة الشبيهة بنظام يونكس عادةً على مكتبة سي في شكل مكتبة مشتركة ، ولكن ملفات الرأس (وسلسلة أدوات المترجم) قد تكون غائبة عن التثبيت، لذا قد لا يكون تطوير سي ممكنًا. تعتبر مكتبة سي جزءًا من نظام التشغيل في الأنظمة الشبيهة بنظام يونكس؛ بالإضافة إلى الوظائف المحددة بواسطة معيار سي، فإنها تتضمن وظائف أخرى تشكل جزءًا من واجهة برمجة تطبيقات نظام التشغيل، مثل الوظائف المحددة في معيار POSIX . تُستخدم وظائف مكتبة سي، بما في ذلك وظائف معيار سي ISO، على نطاق واسع بواسطة البرامج، ويُنظر إليها كما لو كانت ليست مجرد تنفيذ لشيء ما في لغة سي، بل إنها أيضًا جزء فعلي من واجهة نظام التشغيل. لا يمكن لأنظمة التشغيل الشبيهة بنظام يونكس عمومًا أن تعمل إذا تم مسح مكتبة سي. وهذا ينطبق على التطبيقات المرتبطة ديناميكيًا وليس ثابتًا. علاوة على ذلك، تعمل النواة نفسها (على الأقل في حالة لينكس) بشكل مستقل عن أي مكتبات.
في نظام التشغيل Microsoft Windows، توفر مكتبات النظام الديناميكية الأساسية ( DLLs ) تنفيذًا لمكتبة C القياسية لمترجم Microsoft Visual C++ v6.0؛ يتم توفير مكتبة C القياسية للإصدارات الأحدث من مترجم Microsoft Visual C++ بواسطة كل مترجم على حدة، بالإضافة إلى الحزم القابلة لإعادة التوزيع . يتم ربط التطبيقات المترجمة المكتوبة بلغة C إما بشكل ثابت بمكتبة C، أو مرتبطة بإصدار ديناميكي من المكتبة مرفق بهذه التطبيقات، بدلاً من الاعتماد عليها لتكون موجودة على الأنظمة المستهدفة. لا تُعتبر الوظائف في مكتبة C الخاصة بالمترجم بمثابة واجهات لـ Microsoft Windows.
توجد العديد من تطبيقات مكتبة C، والتي يتم توفيرها مع أنظمة تشغيل مختلفة ومُجمِّعات C. فيما يلي بعض التطبيقات الشائعة:
- مكتبة BSD libc ، تطبيقات مختلفة موزعة مع أنظمة التشغيل المشتقة من BSD
- مكتبة GNU C (glibc)، وهي مكتبة مجانية مرخصة بموجب GPL تستخدم في GNU Hurd و GNU/kFreeBSD ومعظم توزيعات Linux
- مكتبة وقت تشغيل Microsoft C ، جزء من Microsoft Visual C++ . هناك نسختان من المكتبة: MSVCRT التي كانت قابلة لإعادة التوزيع حتى v12 / Visual Studio 2013 مع توافق منخفض مع C99، ونسخة جديدة UCRT (وقت تشغيل C العالمي) وهي جزء من Windows 10 و11، لذا فهي موجودة دائمًا للارتباط بها، وهي متوافقة مع C99 أيضًا [1].
- dietlibc ، تنفيذ صغير بديل لمكتبة C القياسية (بدون MMU)
- μClibc ، مكتبة C قياسية لأنظمة μClinux المضمنة (بدون MMU)
- uclibc-ng ، مكتبة C مضمنة، فرع من μClibc، لا تزال قيد الصيانة، مع دعم وحدة إدارة الذاكرة (MMU)
- Newlib ، مكتبة C قياسية للأنظمة المضمنة (بدون MMU) [5] وتستخدم في توزيع Cygwin GNU لنظام Windows
- klibc ، مخصص بشكل أساسي لتشغيل أنظمة Linux
- musl ، تنفيذ آخر لمكتبة C القياسية خفيفة الوزن لأنظمة Linux [6]
- Bionic ، تم تطويره في الأصل بواسطة Google لنظام التشغيل Android المضمن، مشتق من BSD libc
- picolibc، تم تطويره بواسطة Keith Packard ، يستهدف الأنظمة المضمنة الصغيرة ذات ذاكرة الوصول العشوائي المحدودة، استنادًا إلى الكود من Newlib وAVR 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 القياسية سيئة السمعة بسبب وجود ثغرات في تجاوز سعة المخزن المؤقت وتشجيع البرمجة الخاطئة بشكل عام منذ اعتمادها. [أ] العناصر الأكثر انتقادًا هي:
- روتينات معالجة السلسلة ، بما في ذلك
strcpy()وstrcat()، لعدم وجود فحص للحدود وإمكانية تجاوز المخزن المؤقت إذا لم يتم فحص الحدود يدويًا؛ - روتينات السلسلة بشكل عام، للآثار الجانبية ، وتشجيع الاستخدام غير المسؤول للمخزن المؤقت، وعدم ضمان إخراج صالح منتهٍ بعلامة فارغة دائمًا ، وحساب الطول الخطي؛ [ب]
printf()عائلة من الروتينات، لإفساد مكدس التنفيذ عندما لا يتطابق تنسيق السلسلة مع الوسائط المقدمة. أدى هذا الخلل الأساسي إلى إنشاء فئة كاملة من الهجمات: هجمات تنسيق السلسلة ؛gets()وعائلةscanf()من روتينات الإدخال/الإخراج، بسبب عدم وجود فحص لطول الإدخال (سواء كان ذلك سهلاً أو لا).
باستثناء الحالة المتطرفة مع gets()، يمكن تجنب جميع نقاط الضعف الأمنية عن طريق تقديم كود مساعد لأداء إدارة الذاكرة، والتحقق من الحدود، والتحقق من الإدخال، وما إلى ذلك. يتم ذلك غالبًا في شكل غلافات تجعل وظائف المكتبة القياسية أكثر أمانًا وأسهل في الاستخدام. يعود تاريخ هذا إلى كتاب ممارسة البرمجة من تأليف B. Kernighan و R. Pike حيث يستخدم المؤلفون عادةً غلافات تطبع رسائل الخطأ وتخرج من البرنامج إذا حدث خطأ.
نشرت لجنة ISO C التقارير الفنية TR 24731-1 [12] وتعمل على TR 24731-2 [13] لاقتراح اعتماد بعض الوظائف مع التحقق من الحدود وتخصيص المخزن المؤقت تلقائيًا، على التوالي. وقد لاقى الأول انتقادات شديدة مع بعض الثناء، [14] [15] ولقي الأخير ردود فعل متباينة.
على الرغم من المخاوف، تم دمج TR 24731-1 في مسار معايير C في ISO/IEC 9899:2011 (C11)، Annex K ( واجهات التحقق من الحدود )، وتم تنفيذه تقريبًا في مكتبة وقت تشغيل C/++ (CRT) من Microsoft لمنصات Win32 وWin64.
(افتراضيًا، تصدر مُجمِّعات C وC++ في Microsoft Visual Studio تحذيرات عند استخدام وظائف قديمة "غير آمنة". ومع ذلك، فإن تنفيذ Microsoft لـ TR 24731-1 غير متوافق بشكل خفي مع كل من TR 24731-1 والملحق K، [16] لذا فمن الشائع أن تقوم المشاريع المحمولة بتعطيل أو تجاهل هذه التحذيرات. ويمكن تعطيلها مباشرة عن طريق إصدار
#pragma تحذير(تعطيل: 4996)
قبل/حول موقع/مواقع المكالمة المعنية، أو بشكل غير مباشر عن طريق إصدار
#تعريف _CRT_SECURE_NO_WARNINGS 1
قبل تضمين أي رؤوس. [17] يجب أن يكون لخيار سطر الأوامر /D_CRT_NO_SECURE_WARNINGS=1نفس التأثير مثل هذا #define.)
مشاكل الخيوط، والتعرض لظروف السباق
يتم انتقاد الروتين strerror()لكونه غير آمن للخيوط وعرضة لظروف السباق .
معالجة الأخطاء
إن معالجة الأخطاء الخاصة بالوظائف في مكتبة C القياسية ليست متسقة ومربكة في بعض الأحيان. وفقًا لصفحة دليل Linux math_error، "الوضع الحالي (الإصدار 2.8) تحت glibc فوضوي. تثير معظم الوظائف (ولكن ليس كلها) استثناءات على الأخطاء. بعضها أيضًا يضبط errno . تقوم بعض الوظائف بتعيين errno ، لكنها لا تثير استثناء. لا تفعل سوى عدد قليل جدًا من الوظائف أيًا منهما." [18]
التوحيد القياسي
لم تقدم لغة C الأصلية أي وظائف مدمجة مثل عمليات الإدخال/الإخراج، على عكس اللغات التقليدية مثل COBOL و Fortran . [ بحاجة لمصدر ] بمرور الوقت، شاركت مجتمعات مستخدمي لغة C الأفكار وتنفيذ ما يسمى الآن بمكتبات C القياسية. تم دمج العديد من هذه الأفكار في النهاية في تعريف لغة C القياسية.
تم إنشاء كل من يونكس وسي في مختبرات بيل التابعة لشركة إيه تي آند تي في أواخر الستينيات وأوائل السبعينيات. وخلال السبعينيات أصبحت لغة سي شائعة بشكل متزايد. وبدأت العديد من الجامعات والمنظمات في إنشاء إصداراتها الخاصة من اللغة لمشاريعها الخاصة. وبحلول بداية الثمانينيات أصبحت مشاكل التوافق بين تطبيقات سي المختلفة واضحة. وفي عام 1983 شكل المعهد الوطني الأمريكي للمعايير (ANSI) لجنة لإنشاء مواصفة قياسية للغة سي تُعرف باسم " ANSI C ". وبلغ هذا العمل ذروته بإنشاء ما يسمى بمعيار C89 في عام 1989. وكان جزء من المعيار الناتج عبارة عن مجموعة من مكتبات البرامج تسمى مكتبة معيار ANSI C.
مكتبة POSIX القياسية
تحدد POSIX ، وكذلك SUS ، عددًا من الروتينات التي يجب أن تكون متاحة بالإضافة إلى تلك الموجودة في مكتبة C القياسية الأساسية. تتضمن مواصفات POSIX ملفات رأسية لاستخدامات متعددة الخيوط والشبكات والتعبيرات العادية . غالبًا ما يتم تنفيذها جنبًا إلى جنب مع وظائف مكتبة C القياسية، بدرجات متفاوتة من التقارب. على سبيل المثال، تنفذ glibc وظائف مثل within ، ولكن قبل دمج NPTL في glibc، كانت تشكل مكتبة منفصلة مع وسيطة علم الرابط الخاصة بها. غالبًا ما يتم اعتبار هذه الوظيفة المحددة بواسطة POSIX جزءًا من المكتبة؛ يمكن تحديد مكتبة C الأساسية على أنها مكتبة C ANSI أو ISO .
forklibc.so
مكتبة BSD
BSD libc هي مجموعة فرعية من مكتبة معيار POSIX التي تدعمها مكتبات C المضمنة في أنظمة تشغيل BSD مثل FreeBSD و NetBSD و OpenBSD و macOS . تحتوي BSD libc على بعض الامتدادات التي لم يتم تعريفها في المعيار الأصلي، وقد ظهر العديد منها لأول مرة في إصدار 4.4BSD لعام 1994 (أول إصدار تم تطويره على نطاق واسع بعد إصدار المعيار الأول في عام 1989). بعض امتدادات BSD libc هي:
sys/tree.h- يحتوي على تنفيذ لشجرة حمراء-سوداء وشجرة متباعدة [19] [20]sys/queue.h- تنفيذات القائمة المرتبطة ، والطوابير ، وطابور الذيل، وما إلى ذلك. [21] [22]fgetln()- تم تعريفه فيstdio.h. يمكن استخدام هذا لقراءة ملف سطرًا بسطر. [23] [24] [25]fts.h- يحتوي على بعض الوظائف لاجتياز التسلسل الهرمي للملفات [26] [27]db.h- بعض الوظائف للاتصال بقاعدة بيانات بيركلي [28] [29]strlcat()و-strlcpy()بدائل آمنة لـstrncat()[strncpy()30] [31] [32] [33] [34]err.h- يحتوي على بعض الوظائف لطباعة رسائل الخطأ المنسقة [35] [36]vis.h– تحتوي علىvis()الوظيفة. تُستخدم هذه الوظيفة لعرض الأحرف غير القابلة للطباعة بتنسيق مرئي. [37] [38] [39]
مكتبة C القياسية في لغات أخرى
تتضمن بعض اللغات وظائف مكتبة C القياسية في مكتباتها الخاصة. يمكن تعديل المكتبة لتناسب بنية اللغة بشكل أفضل، ولكن الدلالات التشغيلية تظل متشابهة.
سي++
تتضمن لغة C++ أغلب بنيات مكتبة C القياسية في بنيتها الخاصة، باستثناء الآليات الخاصة بلغة C. يتم تصدير وظائف مكتبة C القياسية من مكتبة C++ القياسية بطريقتين.
لتحقيق التوافق العكسي/المتبادل بين لغة C وC++ القياسية السابقة، يمكن الوصول إلى الوظائف في مساحة الأسماء العالمية ( :: )، بعد إدخال اسم رأس C القياسي كما في C. [40] وبالتالي، فإن برنامج C++98#include
#include <stdio.h> int main () { return :: puts ( "مرحبا بالعالم!" ) == EOF ; }
يجب أن يظهر سلوكًا متطابقًا (ظاهريًا) لبرنامج C95
#include <stdio.h> int main ( void ) { return puts ( "مرحبا بالعالم!" ) == EOF ؛ }
بدءًا من C++98 فصاعدًا، أصبحت وظائف C متاحة أيضًا في مساحة الاسم ::std (على سبيل المثال، C printf كـ C++ ::std::printf ، وatoi كـ ::std::atoi ، و feof كـ ::std::feof )، من خلال تضمين header بدلاً من header C المقابل . على سبيل المثال، يحل <cstdio> محل <stdio.h> و <cmath> محل <math.h> ؛ لاحظ عدم وجود امتداد .h في أسماء رؤوس C++.
<chdrname><hdrname.h>
وبالتالي، فإن البرنامج المكافئ (المفضل عمومًا) C++ ≥ 98 للبرنامجين المذكورين أعلاه هو:
#include <cstdio> int main () { return std :: puts ( "مرحبا بالعالم" ) == EOF ; }
يمكن إصدار إعلان أعلى أو داخل
main لتطبيق البادئة ::std:: تلقائيًا، على الرغم من أنه يُعتبر عمومًا ممارسة سيئة لاستخدامها عالميًا في الرؤوس لأنها تلوث مساحة الأسماء العالمية. [41]using namespace ::std
بعض إصدارات C++≥98 من رؤوس لغة C مفقودة؛ على سبيل المثال، C≥11 <stdnoreturn.h> و <threads.h> ليس لهما نظائر بلغة C++. [42]
يتم تقليص البعض الآخر إلى عناصر نائبة، مثل (حتى C++20 ) <ciso646> لـ C95 <iso646.h> ، حيث يتم عرض جميع وحدات الماكرو المطلوبة ككلمات رئيسية في C++98. لا يتم دعم الإنشاءات النحوية الخاصة بـ C بشكل عام، حتى إذا كان رأسها مدعومًا. [43]
توجد عدة رؤوس C في الأساس للتوافق مع C++، وتميل هذه الرؤوس إلى أن تكون شبه فارغة في C++. على سبيل المثال، تتطلب C99 – 17 <stdbool.h> فقط
#define bool _Bool
#define false 0
#define true 1
#define __bool_true_false_are_defined 1
من أجل التظاهر بدعم الكلمات المفتاحية bool و false و true في C++98 في C. يتطلب C++11 <stdbool.h> و <cstdbool> للتوافق، ولكن كل ما يحتاجون إلى تعريفه هو __bool_true_false_are_defined . يتخلى C23 عن الكلمة المفتاحية _Bool القديمة لصالح الكلمات المفتاحية الجديدة المكافئة لـ C++98 bool و false و true ، وبالتالي فإن رؤوس <stdbool.h> / <cstdbool> في C≥23 و C++≥11 متكافئة تمامًا. (على وجه الخصوص، لا يتطلب C23 أي ماكرو __STDC_VERSION_BOOL_H__ لـ <stdbool.h> .)
يُفضَّل الوصول إلى وظائف مكتبة C عبر مساحة الاسم ::std وأسماء رؤوس C++≥98 حيثما أمكن. لتشجيع التبني، تجعل C++98 أسماء رؤوس C ( *.h ) قديمة، لذا فمن الممكن أن يتسبب استخدام رؤوس التوافق مع C في قيام معالج مسبق صارم بشكل خاص من C++98–20 برفع تشخيص من نوع ما. ومع ذلك، فإن C++23 (بشكل غير معتاد) تجعل هذه الرؤوس قديمة، لذا لا ينبغي لتطبيقات/أوضاع C++ الأحدث أن تشتكي دون أن يُطلب منها ذلك على وجه التحديد. [44]
تتبع اللغات الأخرى نهجًا مشابهًا، حيث تضع وظائف/روتينات التوافق مع لغة C تحت مساحة اسم مشتركة؛ وتشمل هذه D و Perl و Ruby .
بايثون
يتضمن CPython غلافات لبعض وظائف مكتبة C في مكتبته المشتركة، كما يمنح أيضًا وصولاً مباشرًا إلى وظائف ومتغيرات C عبر حزمة ctypes الخاصة به . [45]
بشكل عام، يحدد Python 2.x كائنات الملفات المضمنة على أنها "منفذة باستخدام حزمة stdio الخاصة بـ C [ 46 ] " ، ويتم الإشارة بشكل متكرر إلى سلوكيات مكتبة C القياسية؛ ومن المتوقع أن يكون للعمليات المتاحة ( ،،، وما إلى ذلك) نفس سلوك وظائف C المقابلة (،،، openوما إلى ذلك ).
readwritefopenfreadfwrite
ومع ذلك، فإن مواصفات Python 3 تعتمد بشكل أقل بكثير على مواصفات C مقارنة بـ Python 2 .
الصدأ
توفر Rust مكتبة crate libc ، والتي تسمح باستخدام العديد من وظائف مكتبة C القياسية (وغيرها) وتعريفات الأنواع. [47]
مقارنة بالمكتبات القياسية للغات أخرى
تعتبر مكتبة C القياسية صغيرة مقارنة بالمكتبات القياسية لبعض اللغات الأخرى. توفر مكتبة C مجموعة أساسية من الوظائف الرياضية، ومعالجة السلاسل، وتحويلات النوع ، وعمليات الإدخال والإخراج المستندة إلى الملفات ووحدة التحكم. لا تتضمن مجموعة قياسية من " أنواع الحاويات " مثل مكتبة القوالب القياسية C++ ، ناهيك عن أدوات واجهة المستخدم الرسومية الكاملة (GUI)، وأدوات الشبكات، والكثير من الوظائف الأخرى التي توفرها Java و. NET Framework كمعيار. الميزة الرئيسية للمكتبة القياسية الصغيرة هي أن توفير بيئة عمل ISO C أسهل كثيرًا مما هو عليه الحال مع اللغات الأخرى، وبالتالي فإن نقل C إلى منصة جديدة يكون سهلًا نسبيًا.
انظر أيضا
ملحوظات
- ^ تم إنشاء دودة موريس التي تستغل الثغرة الأمنية المعروفة في وقت مبكر من عام 1988.
gets() - ^ في مكتبة C القياسية، فإن حساب طول السلسلة والبحث عن نهاية السلسلة لهما تعقيدات زمنية خطية وغير فعالين عند استخدامهما على نفس السلاسل أو السلاسل ذات الصلة بشكل متكرر
مراجع
- ^ ISO / IEC (2018). ISO/IEC 9899:2018(E): لغات البرمجة - C §7
- ^ "مكتبة جنو سي – مقدمة". gnu.org . تم الاسترجاع في 2013-12-05 .
- ^ "الفرق بين مكتبة C القياسية ومكتبة C POSIX". stackoverflow.com . 2012 . تم الاسترجاع في 2015-03-04 .
- ^ "معايير C". C: معايير C. Keil . تم الاسترجاع في 24 نوفمبر 2011 .
- ^ "Re: هل يدعم Newlib وحدات المعالجة المركزية بدون وحدة ذاكرة؟". Cygwin.com. 23 مارس 2006. مؤرشف من الأصل في 22 نوفمبر 2008. تم الاسترجاع في 28 أكتوبر 2011 .
- ^ "musl libc". Etalabs.net . تم الاسترجاع في 28 أكتوبر 2011 .
- ^ الوظائف المضمنة الأخرى التي يوفرها GCC، دليل GCC
- ^ "التجميع باستخدام cc" . تم الاسترجاع في 2013-03-02 .
- ^ Weimer, Florian. "c - ما هي الوظائف التي تهدف libm إلى تحقيقها؟". Stack Overflow . تم الاسترجاع في 24 فبراير 2021 .
- ^ "c99 - تجميع برامج C القياسية". مواصفات قاعدة مجموعة Open Group، العدد 7، طبعة 2018. مجموعة Open Group . تم الاسترجاع في 24 فبراير 2021 .
- ^ "musl FAQ". www.musl-libc.org . تم الاسترجاع في 24 فبراير 2021 .
- ^ "ISO/IEC TR 24731-1: Extensions to the C Library, Part I: Bounds-checking interfaces" (PDF) . open-std.org. 2007-03-28 . تم الاسترجاع في 2014-03-13 .
- ^ "ISO/IEC WDTR 24731-2: Extensions to the C Library, Part II: Dynamic Allocation Functions" (PDF) . open-std.org. 2008-08-10 . تم الاسترجاع في 2014-03-13 .
- ^ هل تستخدم وظائف TR 24731 'safe' في الكود C الخاص بك؟ - Stack Overflow
- ^ "مراجعة مجموعة أوستن لمعيار ISO/IEC WDTR 24731" . تم الاسترجاع في 28 أكتوبر 2011 .
- ^ "الخبرة الميدانية مع الملحق K—واجهات التحقق من الحدود" . تم الاسترجاع في 9 أكتوبر 2024 .
- ^ "ميزات الأمان في CRT—إزالة تحذيرات الإهمال" . تم الاسترجاع في 9 أكتوبر 2024 .
- ^ "math_error - اكتشاف الأخطاء من الدوال الرياضية". man7.org . 2008-08-11 . تم الاسترجاع في 2014-03-13 .
- ^ "tree". Man.freebsd.org . 2007-12-27 . تم الاسترجاع في 2013-08-25 .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/sys/sys/tree.h". bxr.su .
- ^ "queue". Man.freebsd.org . 2011-05-13 . تم الاسترجاع في 2013-08-25 .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/sys/sys/queue.h". bxr.su .
- ^ "fgetln". Man.freebsd.org . 1994-04-19 . تم الاسترجاع في 2013-08-25 .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/lib/libc/stdio/fgetln.c". bxr.su .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/include/stdio.h". bxr.su .
- ^ "fts". Man.freebsd.org . 2012-03-18 . تم الاسترجاع في 2013-08-25 .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/include/fts.h". bxr.su .
- ^ "db". Man.freebsd.org . 2010-09-10 . تم الاسترجاع في 2013-08-25 .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/include/db.h". bxr.su .
- ^ ميلر، تود سي. وثيو دي رادت. strlcpy و strlcat - نسخ وتسلسل متسق وآمن للسلاسل. وقائع المؤتمر الفني السنوي لـ USENIX لعام 1999، 6-11 يونيو 1999، ص 175-178.
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/lib/libc/string/strlcat.c". bxr.su .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/lib/libc/string/strlcpy.c". bxr.su .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/lib/libc/string/strncat.c". bxr.su .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/lib/libc/string/strncpy.c". bxr.su .
- ^ "err". Man.freebsd.org . 2012-03-29 . تم الاسترجاع 2013-08-25 .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/include/err.h". bxr.su .
- ^ "vis(3)". Man.FreeBSD.org . تم الاسترجاع في 14 سبتمبر 2013 .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/lib/libc/gen/vis.c". bxr.su .
- ^ "مرجع BSD الخاص بمستخدمي Super: /OpenBSD/include/vis.h". bxr.su .
- ^ عناوين مكتبة C++ القياسية—رؤوس توافقية C ، تم الاسترجاع في 9 أكتوبر 2024
- ^ Kieras, David (15 فبراير 2015). "استخدام "using": كيفية استخدام مساحة الاسم القياسية" (PDF) . EECS381 Handouts . قسم EECS، جامعة ميشيغان. مؤرشف (PDF) من الأصل في 2022-12-24 . تم الاسترجاع في 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 .
- ^ "مكتبة Python القياسية، §5.9: كائنات الملفات" . تم الاسترجاع في 9 أكتوبر 2024.
يتم تنفيذ كائنات الملفات باستخدام حزمة
stdio
الخاصة بـ C ويمكن إنشاؤها باستخدام الوظيفة المضمنة
.
open() - ^ "Crate libc". Rust Crates . تم الاسترجاع في 9 أكتوبر 2024 .
قراءة إضافية
- Plauger, PJ (1992). مكتبة Standard C (طبعة واحدة). Prentice Hall. ISBN 978-0131315099.
روابط خارجية
- دليل مرجعي لمكتبة C
- قائمة مفيدة بالرؤوس الموجودة في أي معيار
- روتينات وقت تشغيل Microsoft Universal C حسب الفئة على MSDN
- دليل مكتبات NetBSD C محفوظ في 2015-12-23 على موقع Wayback Machine ومصدر مكتبة C الكامل
- صفحات الدليل لمكتبات C القياسية الأصلية في يونكس
