ما هي ميزات C99 التي تعتبر ضارة أو غير مدعومة [مغلقة

StackOverflow https://stackoverflow.com/questions/1898890

سؤال

عادة ما أكتب رمز C في C89، الآن بعض ميزات C99 (مثل intxx_t أو __VA_ARGS__ أو snprintf) مفيدة للغاية، ويمكن أن تكون حيوية.

قبل أن أكون متطلباتي أكثر من C89 إلى C99، أردت أن أعرف أي من ميزات C99 مدعومة على نطاق واسع وأي منها غير مدعومة على نطاق واسع أو حتى تعتبر ضارة.

أعلم أننا يمكن أن نتحقق فقط من دعم المترجم المستهدف لدينا، ولكن هذا من شأنه أن تضييق دعمنا كثيرا، وكما يكون هذا للحصول على برامج مفتوحة المصدر، فسنفضل وجود دعم أوسع.

على سبيل المثال، نحن نستخدم مترجم سولاريس (Suncc) ومجلس التحصيل الخليجي، ولكن قد يكون هناك مترجم آخر، وسوف نخرج من الطريق بينما يمكننا الحفاظ على التوافق مع القليل جدا من الجهود.

على سبيل المثال، لم أعمل أبدا على Windows أو أعرف أي شيء عن محامرة Windows، ولكن سيكون من الجيد الحفاظ على توافق Windows.

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

المحلول

عدد من ميزات C99 اختيارية، لذلك عدم وجود عدم المطابقة من الناحية الفنية. لن تميز أدناه.

  • هم، الفوز ليس لديه <stdint.h>, ، على الرغم من وجود إصدار مفتوح المصدر من Stdint.h ل Microsoft. وبعد حتى عند تطبيق الملف، فإن العديد من الأنواع الفردية مفقودة.

  • الدعم المعقد والخيال غالبا ما يكون مفقود أو مكسور.

  • يمكن أن تكون المعرفات الموسعة والأحرف الواسعة نقاط مشكلة.

يرى هذه القائمة من مشكلات ميزة C99 في دول مجلس التعاون الخليجي.

نصائح أخرى

goto مازال تعتبر ضارة.


بطريقة ما كنت جمعت أربعة أصوات أسفل. قدمت البيان أعلاه لإضافة ليفية، وأنا فقط 30٪ خطيرة حول المفهوم وراء ذلك.

أتوقع أن تكون الأصوات المنزلة من الصغار الذين لا يفهمون تاريخ لغات البرمجة. لا كل مفرد goto الشر، ولكن مقارنة ب 100٪ من كود السباغيتي غير مهتم، لقد عملت على (ملايين خطوط Fortran 66) - معقولة ومنتجة لاستبدال أكبر عدد ممكن goto البيانات مع البيانات المهيكلة (for, while, do .. while, switch) بقدر الإمكان. ولكن في بعض الأحيان أ goto على ما يرام عندما يتجنب التعقيد، مثل متغيرات العلم الإضافية للخروج من حلقات متداخلة متعددة.

حسنا، ستكون دول مجلس التعاون الخليجي في الأساس إلى دول مجلس التعاون الخليجي بغض النظر عن نظام تشغيل سطح المكتب الذي تستهدفه.

Visual C ++، يجري مترجم C ++ في المقام الأول، لا يهتم تماما بمواصفات C99. STDINT.H هل تعلن وحدات ماكرو INTXX_T المفضلة لديك. __VA_ARGS__ متاح. _Bool، _complex، و _pragma غير مطبق على برنامج التحويل البرمجي Microsoft Visual C ++. أنا متأكد من أن الحقول في Printf / Scanf لم يتم تنفيذها، على الرغم من أن VC2010 يعالجها. Snprintf موجود، ولكن لديه السفلية الرائدة ودلالات مختلفة قليلا.

إجابة قصيرة: ميزة C99 "أسهل" هي تطبيقها دون تغيير قواعد الترجمة من برامج التحويل البرمجي أو قم بتشديد المكتبة القياسية، كلما زاد عدد VC ++ أكثر احتمالا لدعمه. إذا كان هناك تعارض بين C99 و C ++، فنتوقع C ++ للفوز.

وقت التشغيل Sizeof هو كابوس من كتاب المحول البرمجي. لذلك أنا أعتبر ضارة.

لا ينفذ Glibc C99 مطابقة realloc, ، وبالتالي realloc(ptr, 0) غير محمول.

http://sourceware.org/bugzilla/show_bug.cgi؟id=12547.

restrict أصبح كلمة رئيسية في C99. هذا هو التنفيذ التعدي على مساحة اسم المستخدمين. إذا كان لديك برنامج C89 صالح يحتوي على الكلمة restrict, ، يجب عليك تغيير برنامجك لجعله يعمل مع C99. بمعنى آخر: لا التوافق مع الوراء. إذا كانوا سيحطمون التوافق للخلف، فيجب إزالتها gets من المعيار أولا.

وظائف الرياضيات العامة من النوع <tgmath.h> ليس بالضرورة نفذت على نطاق واسع، على الرغم من أنها تبدو مقدمة مع دول مجلس التعاون الخليجي 4.2.1 على ماكو x 10.6.2.

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