هل C99 متوافق مع الإصدارات السابقة مع C89؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

لقد اعتدت على الطراز القديم لـ C وبدأت للتو في استكشاف ميزات c99.لدي سؤال واحد فقط:هل سيتم تجميع برنامجي بنجاح إذا كنت أستخدم c99 في برنامجي، مع علامة c99 gcc وربطه مع مكتبات C99 السابقة؟

لذا، هل يجب أن أتمسك بـ C89 القديم أم أتطور؟

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

المحلول

وأعتقد أنها متوافقة في هذا الصدد. وهذا هو ما دامت الاشياء التي كنت تجميع ضد لا خطوة على أي من الأشياء الجيدة جديدة. على سبيل المثال، إذا كان القانون القديم يحتوي enum bool { false, true }; فأنت في ورطة. كما ديناصور مماثل، وأنا احتضان ببطء العالم الجديد رائع من C99. بعد كل شيء، فقد كان فقط هناك الكامنة لمدة 10 عاما حتى الآن.)

نصائح أخرى

ويجب أن تتطور. شكرا لإصغائكم: -)

في الواقع، سوف توسع على ذلك.

والنقر بزر الماوس كنت أن C99 كانت موجودة منذ فترة طويلة. كنت يجب (في رأيي) أن استخدام هذا المعيار عن أي شيء بخلاف التعليمات البرمجية القديمة (حيث كنت مجرد إصلاح الخلل بدلا من إضافة ميزات جديدة). هو على الأرجح لا يستحق كل هذا العناء لرمز الإرث ولكن يجب أن (كما هو الحال مع جميع القرارات التجارية) القيام بتحليل التكلفة / المنفعة الخاصة.

وأنا سبق لي ضمان قانون جديد متوافق مع C1x - بينما أنا لا تستخدم أي من الميزات الجديدة حتى الآن، ومحاولة للتأكد من أنها لن كسر

وأما بالنسبة لرمز ما أن نبحث عنها، واضعي المعايير تأخذ التوافق <م> جدا محمل الجد. كانت مهمتهم من أي وقت مضى لتصميم لغة جديدة، كان لتقنين الممارسات القائمة.

والمرحلة انهم في هذه اللحظة يسمح لهم بعض مزيدا من الحرية في تحديث اللغة لكنها لا تزال تتبع قسم أبقراط من حيث إنتاجها: "أولا وقبل كل شيء، لا ضرر ولا ضرار"

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

وهذه هي التغييرات السلوكية في المترجم التي لا تحتاج إلى أن تكون على علم وقد تكون مصدر الكثير من القلق وصرير الأسنان إذا بدء تشغيل التطبيق الخاص تعمل غريبة. لا تقلق بشأن "تغيير هادئ في C89" بت - لو كانت problerm، كنت قد سبق للعض من قبلهم

وهذه الوثيقة، بالمناسبة، هو قراءة ممتازة لفهم لماذا يقول المعيار الفعلي ما تقول.

باحترام: جرب واكتشف. :-)

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

إذا كنت لا تنتهك الميزات C99 صريحة، رمز C90 سوف تعمل بشكل جيد العلم C99 مع مكتبات C99 السابقة أخرى.

ولكن هناك بعض دوس المكتبات مقرها في C89 مثل ،، التي من شأنها بالتأكيد ليس العمل.

وC99 هو الكثير من المرونة لذا لا تتردد في الهجرة: -)

والاتفاقيات الدعوة بين مكتبات C لم يتغير في الأعمار، وفي الواقع، لست متأكدا من أي وقت مضى لديها.

وأنظمة التشغيل في هذه المرحلة تعتمد بشكل كبير على C يدعو الاتفاقيات منذ C واجهات برمجة التطبيقات تميل إلى أن تكون الغراء بين القطع من نظام التشغيل.

وهكذا، في الأساس الجواب هو "نعم، الثنائيات سوف تكون متوافقة إلى الوراء. لا، وبطبيعة الحال، التعليمات البرمجية باستخدام C99 ملامح لا يمكن لاحقا جمعها مع المترجم غير C99".

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

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

وهناك بضعة أجزاء من المعيار C89 التي هي مكتوبة بشكل مبهم، واعتمادا على كيفية واحدة تفسر حكم حول أنواع المؤشرات والأشياء التي كنت الوصول إلى، المعيار يمكن اعتباره وصف واحد من لغتين مختلفتين جدا --one منها غويا أكثر من ذلك بكثير قوية وبالتالي يمكن استخدامها في مجموعة واسعة من المجالات، واحدة من الذي يتيح المزيد من الفرص لتحسين القائم مترجم. وC99 ستاندرد "وأوضح" سيادة لتوضيح أنه يجعل أي جهد في سبيل التوافق ولاية مع اللغة السابقة، على الرغم من واختار بأغلبية ساحقة في العديد من المجالات. كما أنه يعامل غير معروف بعض الأشياء التي تم تعريفها في C89 ولكن فقط لأن قواعد C89 لم تكن مكتوبة على وجه التحديد بما فيه الكفاية للا سمح لهم (مثل استخدام memcpy لنوع المجانسه في الحالات التي لديها وجهة مدة كومة).

وC99 قد بالتالي تكون متوافقة مع اللغة التي مؤلفيه الفكر وصفته C89، ولكن غير متوافق مع اللغة التي تم معالجتها من قبل معظم المجمعين C89 في جميع أنحاء 1990s.

بعض ميزات C89 غير صالحة لـ C99

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

المسودة القياسية C99 N1256 تقارن الفقرة 5 من المقدمة C99 بالمراجعات الأقدم، وهي مكان جيد لبدء البحث عن حالات عدم التوافق هذه، على الرغم من أنها تحتوي على امتدادات أكثر بكثير من القيود.

الإرجاع الضمني والأنواع المتغيرة

ذكره لوتز في تعليق، على سبيل المثال.ما يلي صالح C89:

static i;
f() { return 1; }

ولكن ليس C99، حيث عليك أن تكتب:

static int i;
int f() { return 1; }

يمنع هذا أيضًا استدعاء الوظائف التي لا تحتوي على نماذج أولية في C99: هل النماذج الأولية مطلوبة لجميع الوظائف في C89 أو C90 أو C99؟

يقول n1256:

إزالة int الضمني

العودة بدون تعبير للوظيفة غير باطلة

C89 صالح، C99 غير صالح:

int f() { return; }

أعتقد أنه في C89 يقوم بإرجاع قيمة محددة للتنفيذ.يقول n1256:

العودة بدون تعبير غير مسموح بها في الوظيفة التي ترجع قيمة

قسمة عدد صحيح مع المعامل السلبي

  • C89:جولات إلى اتجاه التنفيذ المحدد
  • C99:جولات إلى 0

لذلك إذا تم تقريب المترجم الخاص بك إلى -inf, ، واعتمدت على سلوك التنفيذ المحدد، فإن المترجم الخاص بك مجبر الآن على كسر التعليمات البرمجية الخاصة بك على C99.

https://stackoverflow.com/a/3604984/895245

يقول n1256:

تقسيم عدد صحيح موثوق

التوافق مع ويندوز

أحد الاهتمامات العملية الرئيسية هو القدرة على التجميع في Windows، منذ Microsoft لا تنوي تنفيذ C99 بالكامل في وقت مبكر جدًا.

هذا على سبيل المثال لماذا libgit2 الحدود المسموح بها لميزات C99.

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