C11 (مراجعة معيار C)

C11 (المعروف سابقًا باسم C1X ، ورسميًا ISO/IEC 9899:2011 [ 1 ] ) هو معيار سابق للغة البرمجة C. حلّ محل C99 (المعيار ISO/IEC 9899:1999) ثم حلّ محله C17 (المعيار ISO/IEC 9899:2018). يُوحّد C11 بشكل أساسي الميزات التي تدعمها مُجمّعات البرامج الشائعة حاليًا، ويتضمن نموذجًا تفصيليًا للذاكرة لتحسين دعم تعدد مسارات التنفيذ. نظرًا لتأخر توفر تطبيقات C99 المتوافقة، يجعل C11 بعض الميزات اختيارية، لتسهيل الامتثال لمعيار اللغة الأساسي. [ 2 ] [ 3 ]

تم نشر المسودة النهائية، N1570، [ 4 ] في أبريل 2011. اجتاز المعيار الجديد مراجعة مسودته النهائية في 10 أكتوبر 2011 وتم التصديق عليه رسميًا من قبل المنظمة الدولية للمقاييس (ISO) ونُشر باسم ISO/IEC 9899:2011 في 8 ديسمبر 2011، دون أي تعليقات تتطلب حلًا من قبل الهيئات الوطنية المشاركة.

يتم تعريف ماكرو قياسي __STDC_VERSION__بقيمة 201112Lتشير إلى توفر دعم C11. [ 5 ]

التغييرات عن C99

يتضمن المعيار العديد من التغييرات على لغة C99 ومواصفات المكتبة، مثل [ 6 ]

  • مواصفات المحاذاة ( _Alignasالمحدد، _Alignofالمعامل، aligned_allocالدالة، الرأس)<stdalign.h>
  • _Noreturnمُحدِّد الوظيفة والرأس<stdnoreturn.h>
  • التعبيرات العامة للأنواع باستخدام الكلمة _Genericالمفتاحية. على سبيل المثال، يُترجم الماكرو التالي cbrt(x)إلى cbrtl(x)، cbrt(x)أو cbrtf(x)اعتمادًا على نوع x:
#define cbrt(x) _Generic((x), long double: cbrtl, \  default: cbrt, \  float: cbrtf)(x)
  • دعم تعدد الخيوط_Thread_local ( محدد فئة التخزين، رأس يتضمن وظائف إنشاء/إدارة الخيوط، mutex ، متغير الشرط ووظائف التخزين الخاصة بالخيوط ، بالإضافة إلى [ 7 ] للعمليات الذرية التي تدعم نموذج ذاكرة C11).<threads.h><stdatomic.h>
  • تم تحسين دعم Unicode استنادًا إلى التقرير الفني C Unicode ISO/IEC TR 19769:2004 ( char16_tوأنواع char32_tتخزين البيانات المشفرة بـ UTF-16 / UTF-32 ، بما في ذلك وظائف التحويل في البادئات الحرفية للسلاسل النصية المقابلة ، بالإضافة إلى بادئة السلاسل النصية المشفرة بـ UTF-8 ). [ 8 ]<uchar.h>uUu8
  • إزالة الوظيفة gets(لصالح أكثر أمانًا fgets)، والتي تم إهمالها في مراجعة معيار لغة C السابقة، ISO/IEC 9899:1999/Cor.3:2007(E).
  • واجهات التحقق من الحدود (الملحق ك). [ 9 ]
  • ميزات قابلية التحليل (الملحق L).
  • المزيد من وحدات الماكرو للاستعلام عن خصائص أنواع الفاصلة العائمة، فيما يتعلق بأرقام الفاصلة العائمة غير الطبيعية وعدد الأرقام العشرية التي يمكن للنوع تخزينها.
  • الهيكل المجهول وأعضاء النقابات داخل الهياكل أو النقابات المحتوية، على سبيل المثال في
struct MyStruct { int tag ; union { float f ; int n ; }; struct { int x ; int y ; }; };
  • التأكيدات الثابتة ، التي يتم تقييمها أثناء الترجمة في مرحلة لاحقة من #ifو #error، عندما يفهم المترجم الأنواع.
  • وضع إنشاء وفتح حصري ( "…x"لاحقة) لـ fopen. يتصرف هذا الوضع كما هو الحال O_CREAT|O_EXCLفي نظام POSIX ، والذي يُستخدم عادةً لملفات القفل .
  • الوظيفة quick_exitكطريقة ثالثة لإنهاء البرنامج، تهدف إلى القيام على الأقل بالحد الأدنى من عملية إلغاء التهيئة. [ 10 ]
  • وظيفة جديدة timespec_getوبنية مقابلة لها بدرجة من التوافق مع معيار POSIX .<time.h>
  • وحدات الماكرو لإنشاء القيم المركبة (جزئيًا لأنها real + imaginary*Iقد لا تعطي القيمة المتوقعة إذا imaginaryكانت لانهائية أو NaN ). [ 11 ]

ميزات اختيارية

يسمح التعديل الجديد للتطبيقات بعدم دعم أجزاء معينة من المعيار، بما في ذلك بعض الأجزاء التي كان دعمها إلزاميًا في تعديل عام 1999. [ 12 ] يمكن للبرامج استخدام وحدات ماكرو محددة مسبقًا لتحديد ما إذا كان التطبيق يدعم ميزة معينة أم لا.

الميزات الاختيارية في C11
ميزةاختبار الميزات (ماكرو)
قابلية التحليل (الملحق ل)__STDC_ANALYZABLE__
واجهات التحقق من الحدود (الملحق ك)__STDC_LIB_EXT1__
تعدد الخيوط ( )<threads.h>__STDC_NO_THREADS__
العناصر الأولية الذرية والأنواع ( ومؤهل النوع) [ 13 ]<stdatomic.h>_Atomic__STDC_NO_ATOMICS__
IEC 60559 الحساب ذو الفاصلة العائمة (الملحق F)__STDC_IEC_559__
العمليات الحسابية المعقدة المتوافقة مع معيار IEC 60559 (الملحق G)__STDC_IEC_559_COMPLEX__
الأنواع المعقدة ( )<complex.h>__STDC_NO_COMPLEX__
المصفوفات ذات الطول المتغير [ 14 ]__STDC_NO_VLA__

دعم المُترجم

بعض ميزات C11 مدعومة من قبل GCC بدءًا من الإصدار 4.6، [ 15 ] وClang بدءًا من الإصدار 3.1، [ 16 ] و IBM XL C بدءًا من الإصدار 12.1، [ 17 ] و Microsoft Visual C++ بدءًا من VS 2019 (16.8) [ 18 ] في سبتمبر 2020.

نقد

لا تزال واجهات التحقق من الحدود الاختيارية (الملحق K) مثيرة للجدل ولم تُطبّق على نطاق واسع، وقد اقتُرح إيقاف استخدامها أو إزالتها من المراجعة التالية للمعيار. [ 19 ] حتى مايكروسوفت، وهي من أبرز الداعمين لهذه الواجهة، لا تلتزم بالتعريف. [ 20 ] إضافةً إلى ذلك، لا يتضمن الملحق K معيار TR24731-2 الأكثر فائدة (وظائف التخصيص الديناميكي)، مثل [21] vasprintfو [ 22 ]open_memstream . تشمل التطبيقات القليلة مفتوحة المصدر مكتبة "Safer C" الخاصة بـ Open Watcom C/C++ [ 22 ] ومكتبة safeclib. [ 23 ]

انظر أيضاً

مراجع

  1. "ISO/IEC 9899:2011 - تكنولوجيا المعلومات - لغات البرمجة - C" . www.iso.org .
  2. "WG14 N1250 ميثاق C1X" (PDF) .
  3. "تقسيم معيار C" . www.open-std.org .
  4. مسودة لجنة WG14 N1570 — 12 أبريل 2011
  5. "تقرير العيب رقم 411" . ISO/IEC JTC1/SC22/WG14 - C. فبراير 2012. تاريخ الاسترجاع: 4 مايو 2012 .
  6. مسودة لجنة WG14 N1516 — 4 أكتوبر 2010
  7. "مكتبة العمليات الذرية - cppreference.com" . en.cppreference.com .
  8. "WG14 N1286 — "حول دعم TR-19769 وأنواع الأحرف الجديدة"، نيك ستوتون، لاري دوير" (PDF) .
  9. بيرين بابكوك-ماكونيل. "API02-C. يجب أن تأخذ الدوال التي تقرأ أو تكتب إلى أو من مصفوفة وسيطًا لتحديد حجم المصدر أو الهدف" .
  10. "التخلي عن عملية" . www.open-std.org .
  11. "خلق قيمة معقدة" . www.open-std.org .
  12. مسودة لجنة WG14 N1548 — 2 ديسمبر 2010 6.10.8.3 وحدات الماكرو للميزات الشرطية
  13. "WG14 N1558 محضر اجتماع 14-18 مارس (مسودة)" (PDF) .
  14. ISO 9899:2011 لغات البرمجة - C 6.7.6.2 4
  15. "سلسلة إصدارات GCC 4.6 - التغييرات والميزات الجديدة والإصلاحات - مشروع جنو - مؤسسة البرمجيات الحرة (FSF)" . gcc.gnu.org .
  16. "ملاحظات إصدار Clang 3.1" . llvm.org .
  17. "إضافة دعم معيار ISO C11 إلى مُجمِّعات IBM XL C/C++" . www.ibm.com . 17 أبريل 2014.
  18. "دعم معياري C11 و C17 يصل إلى MSVC" . devblogs.microsoft.com . 14 سبتمبر 2020.
  19. "N1969 - تحديث الخبرة الميدانية مع الملحق K - واجهات فحص الحدود" . www.open-std.org .
  20. ليفلر، جوناثان. "ج - هل تستخدم وظائف TR 24731 'الآمنة'؟" . ستاك أوفرفلو .
  21. "ج - هل تستخدم وظائف TR 24731 'الآمنة'؟" . Stack Overflow .
  22. "مكتبة C الأكثر أمانًا - واتكوم المفتوحة" . 3 مايو 2015. مؤرشف من الأصل في 2015-05-03.
  23. "safec: مكتبة C الآمنة - README" . rurban.github.io .

للمزيد من القراءة