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 ؛}الحواشي:
- قم بالتجميع باستخدام:
gcc-std=c99-mfpmath=387-otest_c99_fptest_c99_fp.c-lm - بما أن علامات حالة IEEE 754 تُعالج في هذه الدالة، فإن هذا التوجيه البرمجي (#pragma) ضروري لتجنب قيام المُصرّف بإعادة ترتيب هذه الاختبارات بشكل خاطئ أثناء التحسين. (عادةً ما تُحدد التوجيهات البرمجية (pragmas) من قِبل التنفيذ، ولكن تلك التي تبدأ بـ #pragma
STDCمُحددة في معيار لغة C). - يحدد معيار C99 عددًا محدودًا من طرق تقييم التعبيرات: يمكن التحقق من وضع التجميع الحالي للتأكد من أنه يفي بالافتراضات التي كُتب الكود بموجبها.
- يمكن اختبار القيم الخاصة مثل NaN واللانهاية الموجبة أو السالبة وتعيينها.
long doubleيُعرَّف هذا النوع بأنه دقة مزدوجة موسعة وفقًا لمعيار IEEE 754 أو دقة رباعية إذا كانت متاحة. استخدام دقة أعلى من المطلوبة للحسابات الوسيطة يمكن أن يقلل من خطأ التقريب [ 13 ] ( يمكن استخدام تعريف النوع هذاdouble_tللتعليمات البرمجية القابلة للنقل تحت جميعFLT_EVAL_METHODالمعايير).- الدالة الرئيسية المراد تقييمها. على الرغم من أن بعض وسائط هذا الكسر المستمر، مثل 3.0، قد تؤدي ظاهريًا إلى خطأ القسمة على صفر، إلا أن الدالة في الواقع مُعرَّفة جيدًا عند 3.0، والقسمة على صفر ستُعيد ببساطة قيمة موجبة لا نهائية، مما سيؤدي بدوره إلى نتيجة نهائية صحيحة. صُمِّم معيار IEEE 754 بحيث لا يُعرِّض لمثل هذه الاستثناءات افتراضيًا، ويمكن تجاهلها في كثير من الأحيان، كما هو الحال هنا. (إذا
FLT_EVAL_METHODعُرِّف الوسيط على أنه 2، فسيتم إجراء جميع العمليات الحسابية الداخلية، بما في ذلك الثوابت، بدقة عددية مزدوجة طويلة؛ أما إذاFLT_EVAL_METHODعُرِّف على أنه 0، فيجب توخي مزيد من الحذر لضمان ذلك، بما في ذلك ربما عمليات تحويل إضافية وتحديد الثوابت صراحةً على أنها أعداد مزدوجة طويلة). - بما أن علامة القسمة على صفر المرتفعة ليست خطأ في هذه الحالة، فيمكن تجاهلها ببساطة لمسح العلامة لاستخدامها بواسطة التعليمات البرمجية اللاحقة.
- في بعض الحالات، قد تعتبر الاستثناءات الأخرى خطأً، مثل تجاوز السعة (على الرغم من أنه يمكن في الواقع إثبات أن هذا لا يمكن أن يحدث في هذه الحالة).
__STDC_IEC_559__يجب تعريفها فقط إذا تم تنفيذ "الملحق F IEC 60559 الحساب ذو الفاصلة العائمة" بالكامل بواسطة المترجم ومكتبة C (يجب أن يكون المستخدمون على دراية بأن هذا الماكرو يتم تعريفه في بعض الأحيان بينما لا ينبغي تعريفه).- الوضع الافتراضي للتقريب هو التقريب لأقرب عدد صحيح (مع تطبيق قاعدة التقريب الزوجي في الحالات المتوسطة) وفقًا لمعيار 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 مبادئ توجيهية حدّت من اعتماد الميزات الجديدة التي لم يتم اختبارها بواسطة التطبيقات الحالية. بُذلت جهود كبيرة في تطوير نموذج للذاكرة ، بهدف توضيح نقاط التسلسل ودعم البرمجة متعددة الخيوط .
انظر أيضاً
- توافق لغتي C و C++
- التقرير الفني الأول للغة C++
- للمزيد من المناقشة حول استخدام معيار IEEE 754 ، يُرجى الرجوع إلى معيار IEEE 754.
مراجع
- ↑ "ISO/IEC 9899:1999 - لغات البرمجة - C" . Iso.org. 8 ديسمبر 2011. تم الاطلاع عليه بتاريخ 8 أبريل 2014 .
- 1 2 "دعم معيار IEEE 754 في لغة C99" (ملف PDF) . معهد مهندسي الكهرباء والإلكترونيات (IEEE ). مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 28 أكتوبر 2017. تم الاطلاع عليه بتاريخ 15 يوليو 2021 .
- ↑ "المعايير - استخدام مجموعة مترجمات جنو (GCC)" . Gcc.gnu.org . تم الاطلاع عليه بتاريخ 8 أبريل 2014 .
- ↑ "خيارات لهجة لغة C - استخدام مجموعة مترجمات GNU (GCC)" . Gcc.gnu.org. 6 مايو 2009. تم الاطلاع عليه في 8 أبريل 2014 .
- ↑ "استخدام مجموعة مترجمات جنو (GCC): المُهيئات المُخصصة" . gnu.org . تم الاطلاع عليه بتاريخ 18 سبتمبر 2019 .
- ↑ "استخدام مجموعة مترجمات جنو (GCC): القيم الحرفية المركبة" . gnu.org . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
- ↑ أولريش دريبر (23 أكتوبر 2007). "ما يجب أن يعرفه كل مبرمج عن الذاكرة" . LWN.net . تم الاطلاع عليه في 3 أبريل 2015 .
- ↑ مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص 119، § 6.7.5.3 مُعرّفات الوظائف (بما في ذلك النماذج الأولية) الفقرة 7.
- ↑ "ما الغرض من الكلمة المفتاحية static في معلمات المصفوفة للدالة مثل "char s[static 10 "؟").
- ↑ "'static' With Array Parameters? Oh My!" .
- ↑ دوغ بريست (1997). "الاختلافات بين تطبيقات IEEE 754" .
- ↑ جاك وور (1 نوفمبر 1997). "محادثة مع ويليام كاهان" .
- ↑ ويليام كاهان (11 يونيو 1996). "الأثر الضار لمعايير الكمبيوتر على الرياضيات التطبيقية والفيزياء والكيمياء" (PDF) .
- ↑ ويليام كاهان (11 يناير 2006). "ما مدى جدوى التقييمات العشوائية للتقريب في حسابات الفاصلة العائمة؟" (PDF) .
- ↑ بيتر برايت (29 يونيو 2013). "الاعتراف أخيراً بمعيار C99 مع تحديد مايكروسوفت مسارها نحو C++14" . آرس تكنيكا . تاريخ الاطلاع: 9 يناير 2015 .
- 1 2 3 برينر، بات. "ما الجديد في Visual C++ في Visual Studio 2015" . شبكة مطوري مايكروسوفت . تم الاطلاع عليه بتاريخ 27 أبريل 2015 .
- ↑ "استخدام مجموعة أدوات مُصرّف x86 Open64" (ملف PDF) . Developer.amd.com. مؤرشف (ملف PDF) من الأصل بتاريخ 24 يناير 2022. تم الاطلاع عليه بتاريخ 2 مارس 2022 .
- ↑ "cc65 - مُترجم لغة C مجاني لأنظمة 6502" . تم الاطلاع عليه بتاريخ 14 سبتمبر 2011 .
- ↑ "ميزات الفصل C99 من مترجم لغة C/C++" . شركة SoftIntegration، 15 فبراير 2008. تم الاطلاع عليه بتاريخ 15 فبراير 2008 .
- ↑ "دليل مستخدم مُترجم Clang" . تم الاطلاع عليه بتاريخ 14 أكتوبر 2017 .
- ↑ "وثائق ودليل مستخدم مُصرّف CompCert C المُدقّق (الإصدار 3.10)" . 19 نوفمبر 2021. تم الاطلاع عليه في 3 مارس 2022 .
- ↑ "الصفحة الرئيسية لشركة libfirm" . تم الاطلاع عليها بتاريخ 4 فبراير 2014 .
- ↑ "تنفيذ لغة C - ديجيتال مارس" . تم الاطلاع عليه بتاريخ 14 سبتمبر 2011 .
- ↑ "حالة ميزات C99 في GCC" . مؤسسة البرمجيات الحرة، 28 يوليو 2021. تم الاطلاع عليه بتاريخ 13 أغسطس 2021 .
- ↑ "حالة ميزات C99 في GCC 4.6" . مؤسسة البرمجيات الحرة، 23 مايو 2013. تم الاطلاع عليه بتاريخ 23 مايو 2013 .
- ↑ "حالة ميزات C99 في GCC 4.7" . مؤسسة البرمجيات الحرة، 23 مايو 2013. تم الاطلاع عليه بتاريخ 23 مايو 2013 .
- ↑ "دلالات العمليات الحسابية ذات الفاصلة العائمة في GCC" . 20 يوليو 2018. تم الاطلاع عليه بتاريخ 12 أغسطس 2018 .
- ↑ "يدعم الإصدار 6.0 من لغة IBM C لنظام AIX الآن معيار C99" . 2 يوليو 2002. تم الاطلاع عليه بتاريخ 31 يناير 2016 .
- ↑ "IBM - XL C/C++ لنظام AIX" . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
- ↑ "دعم IBM Rational Logiscope لمعيار C99 - الولايات المتحدة" . 24 فبراير 2012. تم الاطلاع عليه في 31 يناير 2016 .
- ↑ "أسئلة وأجوبة القراء: ماذا عن VC++ وC99؟" . Sutter's Mill . 3 مايو 2012. تم الاطلاع عليه في 31 يناير 2016 .
- ↑ "A.27 استخدام مصفوفات C99 ذات الطول المتغير" . مايكروسوفت . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
- ↑ "مايكروسوفت لمطوري C99: استخدموا معيار ISO C++" . InfoQ . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
- ↑ "دعم مكتبة C99 في Visual Studio 2013" . مايكروسوفت. 19 يوليو 2013. تم الاطلاع عليه بتاريخ 31 يناير 2016 .
- ↑ "ميزات مكتبة STL في C++11/14، وإصلاحاتها، والتغييرات الجذرية في VS 2013" . Blogs.msdn.com. 28 يونيو 2013. تم الاطلاع عليه بتاريخ 8 أبريل 2014 .
- ↑ "الإعلان عن الدعم الكامل لمعالج مسبق متوافق مع لغتي C/C++ في MSVC" . مايكروسوفت. 27 مارس 2020. تم الاطلاع عليه بتاريخ 17 سبتمبر 2020 .
- ↑ "الامتثال لمعيار C99 في Open Watcom" . مؤرشف من الأصل في 3 مايو 2015. تم الاطلاع عليه في 25 سبتمبر 2015 .
- ↑ "نظرة عامة على Pelles C" . يناير 2013. مؤرشف من الأصل في 13 مارس 2022. تم الاطلاع عليه في 2 مارس 2022 .
- ↑ "صفحة مستودع مترجمات لغة C المحمولة" . تم الاطلاع عليها بتاريخ 21 أبريل 2026 .
- ↑ "Sun Studio 12: C Compiler 5.9 Readme" . شركة Sun Microsystems، 31 مايو 2007. تم الاطلاع عليه بتاريخ 23 سبتمبر 2012 .
- ↑ "وثائق مرجعية لمترجم Tiny C" . تم الاطلاع عليها بتاريخ 31 يناير 2016 .
- ↑ وفقًا لقائمة مهام المشروع،تُعدّ الأنواع المعقدة الميزة الوحيدة المفقودة في لغة C99. تمت إضافة المصفوفات ذات الطول المتغير في TCC 0.9.26
- ↑ "TCC : Tiny C Compiler" . تم الاطلاع عليه بتاريخ 31 يناير 2016 .
- ↑ "المعايير - استخدام مجموعة مترجمات جنو (GCC)" . Gcc.gnu.org . تم الاطلاع عليه بتاريخ 8 أبريل 2014 .
للمزيد من القراءة
- N1256 (المسودة النهائية لمعيار C99 بالإضافة إلى TC1 وTC2 وTC3)؛ WG14؛ 2007. ( إصدارات HTML وASCII )
- ISO/IEC 9899:1999 (المعيار الرسمي C99)؛ ISO ؛ 1999.
- الأساس المنطقي لـ C99 ؛ WG14؛ 2003.
- تشنغ، هاري (1 مارس 2002). "C99 والحوسبة العددية" . مجلة دكتور دوبز .
- سيباخ، بيتر (24 مارس 2004). "تطوير البرمجيات مفتوحة المصدر باستخدام لغة C99" . developerWorks . IBM .
روابط خارجية
- لغة البرمجة سي
- معايير لغات البرمجة
- أدوات برمجة يونكس
- معايير اللجنة الكهروتقنية الدولية
- معايير ISO
