C99

غلاف وثيقة معايير C99

C99 ( كان يُعرف سابقًا باسم C9X خلال تطويره، واسمه الرسمي ISO/IEC 9899:1999 ) هو إصدار سابق من معيار لغة البرمجة C المفتوح . [ 1 ] وهو يُوسّع الإصدار السابق ( C90 ) بميزات جديدة للغة ومكتبتها القياسية ، ويُساعد التطبيقات على الاستفادة بشكل أفضل من موارد أجهزة الحاسوب المتاحة، مثل حسابات الفاصلة العائمة IEEE 754-1985 ، وتقنية المُترجمات. [ 2 ] أما الإصدار C11 من معيار لغة البرمجة C، الذي نُشر عام 2011، فهو تحديث لـ C99.

تاريخ

بعد أن أصدرت المنظمة الوطنية الأمريكية للمعايير (ANSI) المعيار الرسمي للغة البرمجة C عام 1989، والذي أصبح معيارًا دوليًا عام 1990، ظلّت مواصفات لغة C ثابتة نسبيًا لفترة من الزمن، بينما واصلت لغة C++ تطورها، لا سيما خلال جهود توحيد معاييرها الخاصة. وقد أنشأ التعديل المعياري الأول معيارًا جديدًا للغة C عام 1995، ولكن فقط لتصحيح بعض تفاصيل معيار 1989 وإضافة دعم أوسع لمجموعات الأحرف الدولية. وخضع المعيار لمزيد من المراجعة في أواخر التسعينيات، مما أدى إلى نشر معيار ISO/IEC 9899:1999 عام 1999، والذي اعتُمد كمعيار من قِبل ANSI في مايو 2000. وتُعرف اللغة المُعرّفة في تلك النسخة من المعيار باسم "C99". ويتولى فريق العمل ISO/IEC JTC1/SC22 /WG14 صيانة معيار C الدولي.

تصميم

يُعدّ معيار C99 متوافقًا إلى حد كبير مع معيار C89، ولكنه أكثر صرامة في بعض النواحي. [ 3 ]

على وجه الخصوص، لم يعد الإعلان الذي يفتقر إلى مُحدد النوع intيُعتبر ضمنيًا. قررت لجنة معايير لغة C أن من الأجدى للمترجمات تشخيص الإغفال غير المقصود لمُحدد النوع بدلاً من معالجة التعليمات البرمجية القديمة التي تعتمد على الضمنية بصمت int. عمليًا، من المرجح أن تُظهر المترجمات تحذيرًا، ثم تفترض الضمنية intوتواصل ترجمة البرنامج.

قدمت C99 العديد من الميزات الجديدة، والتي تم تنفيذ العديد منها بالفعل كامتدادات في العديد من المترجمات: [ 4 ]

  • الدوال المضمنة
  • التصريحات والتعليمات البرمجية المتداخلة: لم يعد تعريف المتغير مقتصراً على نطاق الملف أو بداية عبارة مركبة (كتلة).
  • تتضمن هذه المكتبة عدة أنواع بيانات جديدة ، منها أنواع الأعداد الصحيحة الموسعة الاختيارية، ونوع بيانات منطقيlong long int صريح، وأنواع البيانات المركبة ( محدد النوع) لتمثيل الأعداد المركبة ._Bool_Complex
  • المصفوفات ذات الطول المتغير (على الرغم من أنها أصبحت لاحقًا في C11 ميزة شرطية لا يُطلب من التطبيقات دعمها)
  • أعضاء المصفوفة المرنة
  • دعم التعليقات المكونة من سطر واحد والتي تبدأ بـ //(مثل تلك الموجودة في BCPL و C++ و Java )
  • وظائف مكتبة جديدة، مثلsnprintf
  • عناوين جديدة ، مثل ، و ، و<stdbool.h><complex.h><tgmath.h><inttypes.h>
  • الدوال الرياضية العامة (الكاكرو)، <tgmath.h>والتي تحدد دالة مكتبة رياضية بناءً على ، أو الوسائط، إلخ.floatdoublelong double
  • دعم اختياري لنقاط عائمة IEEE 754-1985
  • المُهيئات المُخصصة. على سبيل المثال، تهيئة بنية بيانات باستخدام أسماء الحقول: [ 5 ]structXp={.i=1,.j=2};
  • القيم الحرفية المركبة. على سبيل المثال، من الممكن إنشاء هياكل في استدعاءات الدوال: [ 6 ]foo((structX){1,2})
  • دعم وحدات الماكرو المتغيرة (وحدات الماكرو ذات عدد متغير من الوسائط)
  • restrictيسمح التأهيل بتحسين الكود بشكل أكثر فعالية ، مما يؤدي إلى إزالة مزايا الوصول إلى المصفوفة في وقت الترجمة التي كانت تتمتع بها لغة FORTRAN على لغة ANSI C [ 7 ].
  • أسماء الأحرف العالمية، والتي تسمح لمتغيرات المستخدم باحتواء أحرف أخرى غير مجموعة الأحرف القياسية: \u0040تسلسلات سداسية عشرية مكونة من أربعة أو ثمانية أرقام.\U0001f431
  • استخدام الكلمات المفتاحية staticفي مؤشرات المصفوفات في تعريفات المعاملات [ 8 ] : على سبيل المثال، تخبر هذه الكلمة المترجم أنه في كل مرة يتم فيها استدعاء الدالة، فإن المؤشر المُمرر ليس فارغًا بالتأكيد، ويشير إلى مصفوفة تحتوي على 100 عنصر على الأقل. [ 9 ] [ 10 ]voidfoo(intbar[static100]);foo()barint

تم استبعاد بعض ميزات لغة C99 من لغة C++ ، ولا سيما المصفوفات ذات الطول المتغير. توفر لغة C++ هياكل بيانات متسلسلة لأغراض std::vector<T>مماثلة.

 دعم الفاصلة العائمة وفقًا لمعيار IEEE 754

من أبرز ميزات لغة C99 دعمها للعمليات العددية، ولا سيما دعمها للوصول إلى خصائص أجهزة الفاصلة العائمة IEEE 754-1985 (المعروفة أيضًا باسم IEC  60559) الموجودة في الغالبية العظمى من المعالجات الحديثة (المُعرّفة في "الملحق F: حسابات الفاصلة العائمة IEC 60559"). كما يمكن للمنصات التي لا تحتوي على أجهزة IEEE 754 تنفيذ ذلك برمجيًا. [ 2 ] 

على المنصات التي تدعم معيار IEEE  754 للفاصلة العائمة:

  • floatيتم تعريفها على أنها دقة مفردة  IEEE 754 ، ويتم تعريفها على أنها دقة مزدوجة ، ويتم تعريفها على أنها دقة موسعة IEEE 754 (على سبيل المثال، دقة Intel الموسعة المزدوجة 80 بت على منصات x86 أو x86-64 )، أو شكل من أشكال الدقة الرباعية حيثما كان ذلك متاحًا؛ وإلا، فهي دقة مزدوجة.doublelong double 
  • يتم تقريب العمليات الحسابية الأربع والجذر التربيعي بشكل صحيح وفقًا لما هو محدد في معيار IEEE  754.
    FLT_EVAL_METHODيطفومزدوجلونغ دبل
    0يطفومزدوجلونغ دبل
    1مزدوجمزدوجلونغ دبل
    2لونغ دبللونغ دبللونغ دبل
  • يُعرَّف تقييم التعبيرات بأنه يتم بإحدى ثلاث طرق محددة جيدًا، تُشير إلى ما إذا كانت متغيرات الفاصلة العائمة تُحوَّل أولًا إلى صيغة أكثر دقة في التعبيرات: FLT_EVAL_METHOD == 2تُشير إلى أن جميع العمليات الحسابية الوسيطة الداخلية تُجرى افتراضيًا بدقة عالية (عدد عشري طويل مزدوج) حيثما كان ذلك متاحًا (مثلًا، عدد عشري مزدوج ممتد 80  بتFLT_EVAL_METHOD == 1وتُجري جميع التعبيرات الوسيطة الداخلية بدقة مزدوجة (إلا إذا كان أحد المعاملات عددًا عشريًا طويلًا مزدوجًا)، بينما FLT_EVAL_METHOD == 0تُحدد أن كل عملية تُقيَّم فقط بدقة أوسع معامل لكل عامل. يُلخَّص نوع النتيجة الوسيطة للمعاملات ذات الدقة المُحدَّدة في الجدول المجاور.

FLT_EVAL_METHOD == 2يُقلل هذا الأسلوب من مخاطر أخطاء التقريب التي تؤثر على التعبيرات غير المستقرة عدديًا (انظر الأساس المنطقي لتصميم IEEE  754 )، وهو الأسلوب الافتراضي المُصمم لأجهزة x87 ، ولكنه يُنتج سلوكًا غير بديهي للمستخدم غير المُلمّ؛ [ 11 ]FLT_EVAL_METHOD == 1 كان أسلوب التقييم الافتراضي المُستخدم في الأصل في لغة K&R  C ، والذي حوّل جميع الأعداد العشرية إلى أعداد مزدوجة في التعبيرات؛ كما FLT_EVAL_METHOD == 0أنه شائع الاستخدام ويُحدد "تقييمًا إلى نوع" صارم للمعاملات. (بالنسبة لـ gcc ، هو الافتراضي على معالجات x86 ذات 32 بت، وهو الافتراضي على معالجات x86-64 ذات 64 بت، ولكن يُمكن تحديده على x86-64 باستخدام الخيار -mfpmath=387). قبل معيار C99، كان بإمكان المُترجمات تقريب النتائج الوسيطة بشكل غير مُتسق، خاصةً عند استخدام أجهزة x87 ذات الفاصلة العائمة، مما يؤدي إلى سلوك خاص بالمُترجم؛ [ 12 ] لا يُسمح بمثل هذه التناقضات في المُترجمات المُتوافقة مع معيار C99 (الملحق F).FLT_EVAL_METHOD == 2 FLT_EVAL_METHOD == 0 FLT_EVAL_METHOD == 2

مثال

يوضح المثال التالي الموضح في كود C99 لحساب دالة الكسر المستمر الميزات الرئيسية:

#include <assert.h>#include <fenv.h>#include <float.h>#include <math.h>#include <stdio.h>#include <stdbool.h>#include <tgmath.h>double compute_fn ( double z ) { // [1]#pragma STDC FENV_ACCESS ON // [2]assert ( FLT_EVAL_METHOD == 2 ); // [3]إذا ( كان ( z غير عدد صحيح ) { // [4]puts ( "z ليس رقمًا" );}إذا كانت ( z دالة صغرى } {puts ( "z is infinite" );}long double r = 7.0 - 3.0 / ( z - 2.0 - 1.0 / ( z - 7.0 + 10.0 / ( z - 2.0 - 2.0 / ( z - 3.0 )))); // [5, 6]feclearexcept ( FE_DIVBYZERO ); // [7]bool raised = fetestexcept ( FE_OVERFLOW ); // [8]إذا ( تم رفعه ) {puts ( "حدث تجاوز غير متوقع." );}أعد r ؛}int main ( void ) {#ifndef __STDC_IEC_559__puts ( "تحذير: __STDC_IEC_559__ غير مُعرّف. معيار IEEE 754 للفاصلة العائمة غير مدعوم بالكامل." ); // [9]|endif#pragma STDC FENV_ACCESS ON#ifdef TEST_NUMERIC_STABILITY_UPfesetround ( FE_UPWARD ); // [10]#elif TEST_NUMERIC_STABILITY_DOWNfesetround ( FE_DOWNWARD );|endifprintf ( "%.7g \n " , compute_fn ( 3.0 ));printf ( "%.7g \n " , compute_fn ( NAN ));أرجع 0 ؛}

الحواشي:

  1. قم بالتجميع باستخدام:gcc-std=c99-mfpmath=387-otest_c99_fptest_c99_fp.c-lm
  2. بما أن علامات حالة IEEE  754 تُعالج في هذه الدالة، فإن هذا التوجيه البرمجي (#pragma) ضروري لتجنب قيام المُصرّف بإعادة ترتيب هذه الاختبارات بشكل خاطئ أثناء التحسين. (عادةً ما تُحدد التوجيهات البرمجية (pragmas) من قِبل التنفيذ، ولكن تلك التي تبدأ بـ #pragma STDCمُحددة في معيار لغة C).
  3. يحدد معيار C99 عددًا محدودًا من طرق تقييم التعبيرات: يمكن التحقق من وضع التجميع الحالي للتأكد من أنه يفي بالافتراضات التي كُتب الكود بموجبها.
  4. يمكن اختبار القيم الخاصة مثل NaN واللانهاية الموجبة أو السالبة وتعيينها.
  5. long doubleيُعرَّف هذا النوع بأنه دقة مزدوجة موسعة وفقًا لمعيار IEEE 754 أو دقة رباعية إذا كانت متاحة. استخدام دقة أعلى من المطلوبة للحسابات الوسيطة يمكن أن يقلل من خطأ التقريب [ 13 ] ( يمكن استخدام تعريف النوع هذاdouble_t للتعليمات البرمجية القابلة للنقل تحت جميع FLT_EVAL_METHODالمعايير).
  6. الدالة الرئيسية المراد تقييمها. على الرغم من أن بعض وسائط هذا الكسر المستمر، مثل 3.0، قد تؤدي ظاهريًا إلى خطأ القسمة على صفر، إلا أن الدالة في الواقع مُعرَّفة جيدًا عند 3.0، والقسمة على صفر ستُعيد ببساطة قيمة موجبة لا نهائية، مما سيؤدي بدوره إلى نتيجة نهائية صحيحة. صُمِّم معيار IEEE 754 بحيث لا يُعرِّض لمثل هذه الاستثناءات افتراضيًا، ويمكن تجاهلها في كثير من الأحيان، كما هو الحال هنا. (إذا FLT_EVAL_METHODعُرِّف الوسيط على أنه 2، فسيتم إجراء جميع العمليات الحسابية الداخلية، بما في ذلك الثوابت، بدقة عددية مزدوجة طويلة؛ أما إذا FLT_EVAL_METHODعُرِّف على أنه 0، فيجب توخي مزيد من الحذر لضمان ذلك، بما في ذلك ربما عمليات تحويل إضافية وتحديد الثوابت صراحةً على أنها أعداد مزدوجة طويلة).
  7. بما أن علامة القسمة على صفر المرتفعة ليست خطأ في هذه الحالة، فيمكن تجاهلها ببساطة لمسح العلامة لاستخدامها بواسطة التعليمات البرمجية اللاحقة.
  8. في بعض الحالات، قد تعتبر الاستثناءات الأخرى خطأً، مثل تجاوز السعة (على الرغم من أنه يمكن في الواقع إثبات أن هذا لا يمكن أن يحدث في هذه الحالة).
  9. __STDC_IEC_559__يجب تعريفها فقط إذا تم تنفيذ "الملحق F IEC 60559 الحساب ذو الفاصلة العائمة" بالكامل بواسطة المترجم ومكتبة C (يجب أن يكون المستخدمون على دراية بأن هذا الماكرو يتم تعريفه في بعض الأحيان بينما لا ينبغي تعريفه).
  10. الوضع الافتراضي للتقريب هو التقريب لأقرب عدد صحيح (مع تطبيق قاعدة التقريب الزوجي في الحالات المتوسطة) وفقًا لمعيار IEEE 754، ولكن TEST_NUMERIC_STABILITY_UPيمكن استخدام تحديد وضع التقريب بشكل صريح باتجاه اللانهاية الموجبة والسالبة (عن طريق تعريف متغيرات مثل `int` في هذا المثال، عند تصحيح الأخطاء) لتشخيص عدم الاستقرار العددي. [ 14 ] يمكن استخدام هذه الطريقة حتى لو compute_fn()كانت الدالة جزءًا من مكتبة ثنائية مُجمَّعة بشكل منفصل. ولكن، اعتمادًا على الدالة، قد لا يُمكن دائمًا اكتشاف حالات عدم الاستقرار العددي.

الكشف عن الإصدار

__STDC_VERSION__يُعرَّف ماكرو قياسي بقيمة 199901Lتُشير إلى توفر دعم C99. وكما هو الحال مع __STDC__ماكرو C90، __STDC_VERSION__يُمكن استخدامه لكتابة كود يُترجم بشكل مختلف لمترجمي C90 وC99، كما في هذا المثال الذي يضمن inlineتوفره في كلتا الحالتين (عن طريق استبداله بـ staticفي C90 لتجنب أخطاء الرابط).

#if __STDC_VERSION__ >= 199901L /* "inline" كلمة مفتاحية */ #else #define inline static #endif

التطبيقات

توفر معظم مترجمات لغة C الدعم لبعض الميزات التي تم تقديمها في C99 على الأقل.

لطالما كانت مايكروسوفت بطيئة في تطبيق ميزات لغة C الجديدة في أدوات Visual C++ الخاصة بها ، حيث ركزت بدلاً من ذلك بشكل أساسي على دعم التطورات في معايير C++. [ 15 ] ومع ذلك، مع إطلاق Visual C++ 2013، طبقت مايكروسوفت مجموعة فرعية محدودة من معيار C99، والتي تم توسيعها في Visual C++ 2015. [ 16 ]

المترجممستوى الدعمتفاصيل توافق C99
Acorn C/C++جزئيتنص الوثائق الرسمية على أن "معظم" ميزات المترجم مدعومة، إلى جانب "بعض" وظائف المكتبة.
مجموعة برامج تجميع AMD x86 Open64في الغالبيدعم لغة C99 بنفس مستوى دعم GCC. [ 17 ]
cc65جزئيلم يتم تطبيق الدعم الكامل لتقنيتي C89 وC99، ويعود ذلك جزئيًا إلى قيود المنصة ( MOS Technology 6502 ). ولا توجد خطط لدعم بعض أنواع C99 مثل الأعداد المركبة والأعداد الصحيحة 64 بت (long long). [ 18 ]
الفصلجزئييدعم الميزات الرئيسية لـ C99. [ 19 ]
كلانغفي الغالبيدعم جميع الميزات باستثناء تعليمات C99 للفاصلة العائمة. [ 20 ]
شهادة المطابقةفي الغالبمُصرّف معتمد، تم إثبات صحته رسميًا. يدعم جميع الميزات باستثناء الأعداد المركبة C99 وVLA، وقيود طفيفة على عبارات التبديل (لا يدعم جهاز داف ). [ 21 ]
محلل cparserممتلىءيدعم ميزات C99. [ 22 ]
منشئ C++يعمل فقط في وضع 64 بت، لأن الأخير هو نسخة معدلة من CLang
مُترجم لغة C/C++ من Digital Marsجزئييفتقر إلى دعم بعض الميزات، مثل < tgmath.h > و _Pragma. [ 23 ]
مجلس التعاون الخليجيفي الغالباعتبارًا من يوليو 2021 تفتقر النسخة الرئيسية من GCC إلى توجيهات البرمجة القياسية ودعم الأعداد العشرية وفقًا لمعياري IEEE 754/IEC 60559. إضافةً إلى ذلك، يجب توفير بعض الميزات (مثل أنواع الأعداد الصحيحة الموسعة ووظائف المكتبة الجديدة) من خلال مكتبة C القياسية، وهي خارج نطاق GCC. [ 24 ] كما توفر إصدارات GCC 4.6 و4.7 نفس مستوى التوافق. [ 25 ] [ 26 ] يتوفر دعم جزئي لمعيار IEEE  754، حتى مع توافق الأجهزة: قد تكون هناك حاجة إلى بعض خيارات المُصرّف لتجنب التحسينات غير الصحيحة (مثل ` -std=c99and` -fsignaling-nans)، ولكن الدعم الكامل لأنماط التقريب الموجه غير متوفر حتى عند -frounding-mathاستخدام `and`. [ 27 ]
شركة غرين هيلز للبرمجياتممتلىء
IBM C لنظام AIX، الإصدار 6 [ 28 ] و XL C/C++ الإصدار 11.1 لنظام AIX [ 29 ]ممتلىء
IBM Rational Logiscopeممتلىءحتى الإصدار 6.3 من برنامج Logiscope، لم يكن يدعم سوى البنى الأساسية للغة C99. أما الإصدار 6.4 والإصدارات اللاحقة من البرنامج، فقد أصبح يدعمها رسميًا. [ 30 ]
مجموعة بورتلاند PGI C/C++ممتلىء
بيئة عمل الأنظمة المدمجة من IARفي الغالبلا يدعم أسماء الأحرف العالمية (UCN). مُصرّف للأنظمة المدمجة، مثل ARM وColdfire وMSP430 وAVR وAVR32 و8051، ... لا يدعم أنظمة x86.
مُترجم لغة C++ من إنتلفي الغالب
مايكروسوفت فيجوال سي++جزئي [ 16 ]لم يدعم Visual C++ 2012 والإصدارات الأقدم معيار C99. [ 31 ] [ 32 ] [ 33 ] يُطبّق Visual C++ 2013 مجموعة فرعية محدودة من C99 اللازمة لتجميع مشاريع المصادر المفتوحة الشائعة. [ 34 ] [ 35 ] يُطبّق Visual C++ 2015 مكتبة C99 القياسية، باستثناء أي ميزات مكتبة تعتمد على ميزات المُصرّف غير المدعومة بعد (على سبيل المثال، <tgmath.h > غير مُطبّقة). [ 16 ] يُضيف Visual C++ 2019 (16.6) دعمًا اختياريًا لمعالج مُسبق مُتوافق مع C99. [ 36 ]
افتح واتكومجزئيتُنفّذ هذه المكتبة الأجزاء الأكثر استخدامًا من المعيار. مع ذلك، لا تُفعّل هذه الأجزاء إلا عبر خيار سطر الأوامر غير الموثق "-za99". وقد جُمعت ثلاث ميزات من C99 كامتدادات C90 منذ الإصدارات السابقة للإصدار 1.0: التعليقات بنمط C++ (//)، وأعضاء المصفوفات المرنة، والسماح باستخدام الفاصلة في نهاية تعريفات التعداد. [ 37 ]
بيلي سيممتلىءيدعم جميع ميزات C99. [ 38 ]
مترجم لغة C محمولجزئيالعمل على تحقيق الامتثال لمعيار C99. [ 39 ]
استوديو صنكامل [ 40 ]
مجموعة أدوات تجميع أمسترداملايخضع برنامج C99 للواجهة الأمامية حاليًا للتحقيق.
مُجمِّع Tiny Cجزئيلا يدعم الأعداد المركبة. [ 41 ] [ 42 ] يدعم المصفوفات ذات الأطوال المتغيرة، ولكن ليس كوسائط في الدوال . ويذكر المطورون أن "TCC يتجه نحو التوافق الكامل مع معيار ISOC99". [ 43 ]
vbccجزئي

العمل المستقبلي

منذ التصديق على معيار لغة C لعام 1999، أعدّ فريق عمل المعايير تقارير فنية تُحدد تحسينات في دعم المعالجة المدمجة، وأنواع بيانات الأحرف الإضافية ( دعم Unicode )، ووظائف المكتبة مع تحسينات في فحص الحدود . ويتواصل العمل على تقارير فنية تتناول الأعداد العشرية ذات الفاصلة العائمة ، ووظائف رياضية خاصة إضافية ، ووظائف إضافية لتخصيص الذاكرة الديناميكية . وتتعاون لجان معايير لغتي C وC++ في وضع مواصفات البرمجة متعددة الخيوط .

تمت المصادقة على المراجعة التالية لمعيار لغة C، C11 ، في عام 2011. [ 44 ] اعتمدت لجنة معايير لغة C مبادئ توجيهية حدّت من اعتماد الميزات الجديدة التي لم يتم اختبارها بواسطة التطبيقات الحالية. بُذلت جهود كبيرة في تطوير نموذج للذاكرة ، بهدف توضيح نقاط التسلسل ودعم البرمجة متعددة الخيوط .

انظر أيضاً

مراجع

  1. "ISO/IEC 9899:1999 - لغات البرمجة - C" . Iso.org. 8 ديسمبر 2011. تم الاطلاع عليه بتاريخ 8 أبريل 2014 .
  2. 1 2 "دعم معيار IEEE 754 في لغة C99" (ملف PDF) . معهد مهندسي الكهرباء والإلكترونيات (IEEE ). مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 28 أكتوبر 2017. تم الاطلاع عليه بتاريخ 15 يوليو 2021 .
  3. "المعايير - استخدام مجموعة مترجمات جنو (GCC)" . Gcc.gnu.org . تم الاطلاع عليه بتاريخ 8 أبريل 2014 .
  4. "خيارات لهجة لغة C - استخدام مجموعة مترجمات GNU (GCC)" . Gcc.gnu.org. 6 مايو 2009. تم الاطلاع عليه في 8 أبريل 2014 .
  5. "استخدام مجموعة مترجمات جنو (GCC): المُهيئات المُخصصة" . gnu.org . تم الاطلاع عليه بتاريخ 18 سبتمبر 2019 .
  6. "استخدام مجموعة مترجمات جنو (GCC): القيم الحرفية المركبة" . gnu.org . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
  7. أولريش دريبر (23 أكتوبر 2007). "ما يجب أن يعرفه كل مبرمج عن الذاكرة" . LWN.net . تم الاطلاع عليه في 3 أبريل 2015 .
  8. مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص 119، § 6.7.5.3 مُعرّفات الوظائف (بما في ذلك النماذج الأولية) الفقرة 7.
  9. "ما الغرض من الكلمة المفتاحية static في معلمات المصفوفة للدالة مثل "char s[static 10 "؟").
  10. "'static' With Array Parameters? Oh My!" .
  11. دوغ بريست (1997). "الاختلافات بين تطبيقات IEEE 754" .
  12. جاك وور (1 نوفمبر 1997). "محادثة مع ويليام كاهان" .
  13. ويليام كاهان (11 يونيو 1996). "الأثر الضار لمعايير الكمبيوتر على الرياضيات التطبيقية والفيزياء والكيمياء" (PDF) .
  14. ويليام كاهان (11 يناير 2006). "ما مدى جدوى التقييمات العشوائية للتقريب في حسابات الفاصلة العائمة؟" (PDF) .
  15. بيتر برايت (29 يونيو 2013). "الاعتراف أخيراً بمعيار C99 مع تحديد مايكروسوفت مسارها نحو C++14" . آرس تكنيكا . تاريخ الاطلاع: 9 يناير 2015 .
  16. 1 2 3 برينر، بات. "ما الجديد في Visual C++ في Visual Studio 2015" . شبكة مطوري مايكروسوفت . تم الاطلاع عليه بتاريخ 27 أبريل 2015 .
  17. "استخدام مجموعة أدوات مُصرّف x86 Open64" (ملف PDF) . Developer.amd.com. مؤرشف (ملف PDF) من الأصل بتاريخ 24 يناير 2022. تم الاطلاع عليه بتاريخ 2 مارس 2022 .
  18. "cc65 - مُترجم لغة C مجاني لأنظمة 6502" . تم الاطلاع عليه بتاريخ 14 سبتمبر 2011 .
  19. "ميزات الفصل C99 من مترجم لغة C/C++" . شركة SoftIntegration، 15 فبراير 2008. تم الاطلاع عليه بتاريخ 15 فبراير 2008 .
  20. "دليل مستخدم مُترجم Clang" . تم الاطلاع عليه بتاريخ 14 أكتوبر 2017 .
  21. "وثائق ودليل مستخدم مُصرّف CompCert C المُدقّق (الإصدار 3.10)" . 19 نوفمبر 2021. تم الاطلاع عليه في 3 مارس 2022 .
  22. "الصفحة الرئيسية لشركة libfirm" . تم الاطلاع عليها بتاريخ 4 فبراير 2014 .
  23. "تنفيذ لغة C - ديجيتال مارس" . تم الاطلاع عليه بتاريخ 14 سبتمبر 2011 .
  24. "حالة ميزات C99 في GCC" . مؤسسة البرمجيات الحرة، 28 يوليو 2021. تم الاطلاع عليه بتاريخ 13 أغسطس 2021 .
  25. "حالة ميزات C99 في GCC 4.6" . مؤسسة البرمجيات الحرة، 23 مايو 2013. تم الاطلاع عليه بتاريخ 23 مايو 2013 .
  26. "حالة ميزات C99 في GCC 4.7" . مؤسسة البرمجيات الحرة، 23 مايو 2013. تم الاطلاع عليه بتاريخ 23 مايو 2013 .
  27. "دلالات العمليات الحسابية ذات الفاصلة العائمة في GCC" . 20 يوليو 2018. تم الاطلاع عليه بتاريخ 12 أغسطس 2018 .
  28. "يدعم الإصدار 6.0 من لغة IBM C لنظام AIX الآن معيار C99" . 2 يوليو 2002. تم الاطلاع عليه بتاريخ 31 يناير 2016 .
  29. "IBM - XL C/C++ لنظام AIX" . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
  30. "دعم IBM Rational Logiscope لمعيار C99 - الولايات المتحدة" . 24 فبراير 2012. تم الاطلاع عليه في 31 يناير 2016 .
  31. "أسئلة وأجوبة القراء: ماذا عن VC++ وC99؟" . Sutter's Mill . 3 مايو 2012. تم الاطلاع عليه في 31 يناير 2016 .
  32. "A.27 استخدام مصفوفات C99 ذات الطول المتغير" . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
  33. "مايكروسوفت لمطوري C99: استخدموا معيار ISO C++" . InfoQ . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
  34. "دعم مكتبة C99 في Visual Studio 2013" . مايكروسوفت. 19 يوليو 2013. تم الاطلاع عليه بتاريخ 31 يناير 2016 .
  35. "ميزات مكتبة STL في C++11/14، وإصلاحاتها، والتغييرات الجذرية في VS 2013" . Blogs.msdn.com. 28 يونيو 2013. تم الاطلاع عليه بتاريخ 8 أبريل 2014 .
  36. "الإعلان عن الدعم الكامل لمعالج مسبق متوافق مع لغتي C/C++ في MSVC" . مايكروسوفت. 27 مارس 2020. تم الاطلاع عليه بتاريخ 17 سبتمبر 2020 .
  37. "الامتثال لمعيار C99 في Open Watcom" . مؤرشف من الأصل في 3 مايو 2015. تم الاطلاع عليه في 25 سبتمبر 2015 .
  38. "نظرة عامة على Pelles C" . يناير 2013. مؤرشف من الأصل في 13 مارس 2022. تم الاطلاع عليه في 2 مارس 2022 .
  39. "صفحة مستودع مترجمات لغة C المحمولة" . تم الاطلاع عليها بتاريخ 21 أبريل 2026 .
  40. "Sun Studio 12: C Compiler 5.9 Readme" . شركة Sun Microsystems، 31 مايو 2007. تم الاطلاع عليه بتاريخ 23 سبتمبر 2012 .
  41. "وثائق مرجعية لمترجم Tiny C" . تم الاطلاع عليها بتاريخ 31 يناير 2016 .
  42. وفقًا لقائمة مهام المشروع،تُعدّ الأنواع المعقدة الميزة الوحيدة المفقودة في لغة C99. تمت إضافة المصفوفات ذات الطول المتغير في TCC 0.9.26
  43. "TCC : Tiny C Compiler" . تم الاطلاع عليه بتاريخ 31 يناير 2016 . 
  44. "المعايير - استخدام مجموعة مترجمات جنو (GCC)" . Gcc.gnu.org . تم الاطلاع عليه بتاريخ 8 أبريل 2014 .

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