HeadlinesBriefing HeadlinesBriefing.com

لغة C التي تستخدمها ليست C القياسية

Hacker News •
×

هذه قائمة غير كاملة بأوجه عدم التوافق بين لغة C كما هي مكتوبة في المعيار، ولغة C كما هي موجودة فعليًا لدى من يستخدمون gcc أو clang مع glibc أو musl.

تتعرّف gcc وclang افتراضيًا على الكلمة المفتاحية asm كامتداد. في لغة C القياسية، تُعدّ asm معرّفًا صالحًا غير محجوز، لذلك قد يفشل تجميع الكود المتوافق مع المعيار بالإعدادات الافتراضية. المترجمات غير متوافقة تمامًا افتراضيًا، ويمكن للمعيار أن يجعل asm كلمة محجوزة كما في C++، لكنه لم يفعل ذلك.

يشترط المعيار أن يعكس FLT_ROUNDS تغييرات وضع التقريب التي تحدث أثناء التشغيل عبر fesetround في <fenv.h>. غير أن gcc تُعرّف FLT_ROUNDS دائمًا بالقيمة 1 (التقريب إلى الأقرب)، بصرف النظر عن وضع التقريب أثناء التشغيل. توفر clang دالة مدمجة هي __builtin_flt_rounds()، أما gcc فلا تملكها.

يحدد معيار C توجيهات الفاصلة العائمة، التي أُضيفت في C99 وC23، للتحكم في سلوك العمليات الحسابية. وبعد أكثر من 27 عامًا على C99، ما زالت gcc تتجاهلها جميعًا بوصفها عمليات فارغة، بينما تدعم clang توجيهات C99 فقط. يمكن محاكاة بعض هذه الوظائف بخيارات سطر الأوامر، لكنها تنطبق على وحدة الترجمة بأكملها لا على دوال أو كتل فردية.

يشترط المعيار إسقاط المؤهلات في أنواع إرجاع الدوال. أما clang فتعاملها كعناصر ذات دلالة، لذلك يؤدي التصريح عن int f(); وconst int f(); معًا إلى خطأ تعارض في الأنواع، رغم أن التصريحين يجب أن يكونا متطابقين.

المصدر: Hacker News · لخّصه HeadlinesBriefing