سؤال

ما مدى دعم معيار C99 عالميًا في المترجمين اليوم؟وأنا أفهم أنه حتى دول مجلس التعاون الخليجي لا تدعمها بشكل كامل.هل هذا صحيح؟

ما هي ميزات C99 المدعومة أكثر من غيرها، على سبيل المثال؟ما الذي يمكنني استخدامه للتأكد تمامًا من أن معظم المترجمين سيفهمونني؟

هل كانت مفيدة؟

المحلول

إذا كنت تريد كتابة كود C محمول، فأنا أقترح عليك الكتابة بـ C89 (معيار ANSI C القديم).هذا المعيار مدعوم من قبل معظم المترجمين.

يحتوي مترجم Intel C على دعم C99 جيد جدًا وتنتج ثنائيات سريعة.(شكرًا 0x69!)

يدعم MSVC بعض الميزات الجديدة وتخطط Microsoft لتوسيع الدعم في الإصدارات المستقبلية.

دول مجلس التعاون الخليجي تدعم بعض الأشياء الجديدة من C99.قاموا بإنشاء جدول حول حالة ميزات C99.من المحتمل أن الميزة الأكثر استخدامًا في C99 هي المصفوفة ذات الطول المتغير، ويدعمها دول مجلس التعاون الخليجي الآن. رنة (واجهة LLVM's C) تدعم معظم الميزات باستثناء براغما الفاصلة العائمة.

يبدو أن ويكيبيديا لديها ملخص جميل لدعم C99 من المجمعين.

نصائح أخرى

ذكر أحدهم أن مترجم Intel لديه دعم C99.وهناك أيضا مترجم Comeau C/C++ الذي يدعم بشكل كامل C99.هذه هي الوحيدة التي أعرفها.

تتضمن ميزات C99 التي لا أستخدمها لأنها غير مدعومة بشكل جيد ما يلي:

  • مصفوفات ذات أطوال متغيرة
  • وحدات الماكرو مع عدد متغير من المعلمات.

ميزات C99 التي أستخدمها بانتظام والتي يبدو أنها مدعومة جيدًا (باستثناء Microsoft):

  • stdint.h
  • snprintf() - MS لديه غير قياسي _snprintf() يحتوي على قيود خطيرة تتمثل في عدم إنهاء المخزن المؤقت دائمًا وعدم الإشارة إلى الحجم الذي يجب أن يكون عليه المخزن المؤقت

للتغلب على عدم دعم Microsoft، أستخدم ملف المجال العام stdint.h من MinGW (الذي قمت بتعديله للعمل أيضًا على VC6) وa المجال العام تقريبا snprintf() من هولجر فايس

تتضمن العناصر التي لا تدعمها Microsoft، ولكنها ستستمر في استخدامها على المترجمين الآخرين اعتمادًا على المشروع ما يلي:

  • إعلانات ورمز مختلط
  • وظائف مضمنة
  • _Pragma() - وهذا يجعل البراغما أكثر قابلية للاستخدام

بالنسبة لدول مجلس التعاون الخليجي، هناك الجدول مع كافة الميزات المدعومة.يبدو أن أكبر شيء مفقود هو المصفوفات ذات الطول المتغير.معظم الميزات الأخرى المفقودة هي مشكلات المكتبة وليست ميزات اللغة.

يتمتع برنامج التحويل البرمجي IBM c بدعم c99 عند استدعائه كـ c99 ولكن ليس عند استدعائه كـ cc أو xlc.

ينظر الى حالة دعم C99 لـ GNU للحصول على تفاصيل حول الميزات المدعومة حاليًا.

استوديو الشمس يُزعم أنه يدعم مواصفات C99 بأكملها.لم أستخدمها مطلقًا، لذلك لا يمكنني التأكيد.

لا أعتقد أن مترجم Microsoft يدعم مواصفات C99 بالكامل.إنهم يركزون أكثر على C++ في الوقت الحالي

يتمتع Clang (مترجم C وC++ المعتمد على LLVM) بدعم جيد جدًا لـ C99.أعتقد أن الشيء الوحيد الذي لا يدعمه هو براغما النقطة العائمة.

يبدو أن Microsoft تتبع معايير C++، ولكن ليس لديها دعم لـ C99.(قد يختارون بعض الميزات، ولكن يمكن القول أنهم يختارون C++0x بشكل الكرز حيث يوجد تداخل.)

اعتبارًا من Visual Studio .NET 2003، تم تمكين الخيار "Compile C code as C++ (/TP)" افتراضيًا في المشاريع الجديدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top