لماذا لم تكن جديدة (عرض بت عرض خاص) طباعة () خيار خيار تبني كجزء من C99؟

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

سؤال

أثناء البحث عن كيفية القيام عبر منصة printf() Format Strings في C (أي، مع مراعاة عدد البتات وأتوقع أن تكون كل حجة عدد صحيح printf() يجب أن يكون) ركضت عبر هذا القسم من مقالة ويكيبيديا printf(). وبعد تناقش المقالة الخيارات غير القياسية التي يمكن تمريرها إلى printf() سلاسل التنسيق، مثل (ما يبدو أن تمديد معين من Microsoft):

printf("%I32d\n", my32bitInt);

يذهب إلى الدولة:

يشتمل ISO C99 على ملف رأس Inttypes.h الذي يتضمن عددا من وحدات الماكرو للاستخدام في ترميز الطباعة الأساسي المستقل من النظام الأساسي.

... ثم يسرد مجموعة من وحدات الماكرو التي يمكن العثور عليها في الرأس المذكور. النظر في ملف الرأس، لاستخدامها، يجب أن أكتب:

 printf("%"PRId32"\n", my32bitInt);

سؤالي هو: هل أنا أفتقد شيئا؟ هل هذا هو حقا طريقة C99 القياسية للقيام بذلك؟ إذا كان الأمر كذلك لماذا؟ (على الرغم من أنني لست مندهشا لأنني لم أر التعليمات البرمجية التي تستخدم سلاسل التنسيق بهذه الطريقة، حيث يبدو مرهقا جدا ...)

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

المحلول

يبدو أن الأساس المنطقي الذي يعني ذلكu003Cinttypes.h> هو توحيد الممارسة الحالية:

u003Cinttypes.h> تم اشتقاقها من رأس نفس الاسم الموجود على العديد من أنظمة 64 بت الموجودة.

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

ما يلي هو مجرد تكهنات، ولكن التعليم عن طريق تجربة كيفية عمل لجان التقييس.

ميزة واحدة من وحدات الماكرو C99 على توحيد محدد تنسيق إضافي لبرنامج printf (لاحظ أن C99 أيضا أضف بعضها) هو توفير <inttypes.h> و <stdint.h> عندما يكون لديك بالفعل تنفيذ يدعم الميزات المطلوبة في التنفيذ طريقة محددة هي مجرد كتابة ملفين مع Typedef وحدات الماكرو المناسبة. التي تقلل من تكلفة إجراء مطابقة التنفيذ الحالية، مما يقلل من خطر كسر البرامج الحالية التي أصبحت تستخدم ميزات تفاصيل التنفيذ الحالية (الطريقة القياسية لا تتداخل) وتسهيل نقل البرامج المطابقة إلى التنفيذ الذي لا تملك هذه رؤوس (يمكن توفيرها من قبل البرنامج). بالإضافة إلى ذلك، إذا كان التنفيذ طرق محددة متنوعة بالفعل في ذلك الوقت، فإنه لا يفقل تنفيذ واحد على آخر.

نصائح أخرى

صحيح، هذه هي الطريقة التي تقول معيار C99 أنه يجب عليك استخدامها. إذا كنت تريد رمز Portablt حقيقي هو معايير 100٪ مطابقة للحرف، يجب عليك دائما طباعة int استخدام "%d" و int32_t استخدام "%"PRId32.

معظم الناس لن يزعجهم، رغم ذلك، لأن هناك حالات قليلة للغاية حيث يكون الفشل في القيام بذلك مهم. ما لم تكن تقوم بتنفيذ التعليمات البرمجية الخاصة بك إلى Win16 أو DOS، فيمكنك نفترض ذلك sizeof(int32_t) <= sizeof(int), ، لذلك فهي غير ضارة لبرنامج printf عن طريق الخطأ int32_t كما int. وبعد وبالمثل، أ. long long هو إلى حد كبير 64 بت أكثر من 64 بت (على الرغم من أنها غير مضمونة لتكون كذلك)، لذلك طباعة int64_t ك long long (على سبيل المثال مع %llx المواصفات) آمنة كذلك.

الأنواع int_fast32_t, int_least32_t, ، et al بالكاد تستخدم على الإطلاق، حتى تتمكن من تخيل أن محطات التنسيق المقابلة تستخدم أكثر ونادرا.

يمكنك دائما يلقي أيضا للأعلى والاستخدام %jd وهو intmax_t تنسيق محدد.

printf("%jd\n", (intmax_t)(-2));

انا إستعملت intmax_t لإظهار أن أي intXX_t يمكن استخدامها، ولكن ببساطة الصب ل long هو أفضل بكثير ل int32_t الحالة، ثم استخدام %ld.

يمكنني فقط التكهن حول السبب. أحب إجابة Aprogmer أعلاه، ولكن هناك جانب واحد يتم تجاهله: ماذا ستضيف إلى Printf كمعدل تنسيق؟ هناك بالفعل طريقتان مختلفتان يتم استخدام الأرقام في سلسلة تنسيق Printf (العرض والدقة). إضافة نوعا ثالثا من العدد القول لك عدد بت الدقة الموجودة في الحجة تكون كبيرة، ولكن من أين ستضعها دون مربكة الناس؟ لسوء الحذر من العيوب في C هو أن printf لم تكن مصممة لتكون قابلة للتوسيع.

وحدات الماكرو فظيعة، ولكن عندما يكون لديك لكتابة التعليمات البرمجية المحمولة عبر منصات 32 بت و 64 بت، فهي آلهة. بالتأكيد أنقذ لحم الخنزير المقدد بلدي.

أعتقد أن الإجابة على سؤالك لماذا اما

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

احتمال آخر: التوافق المتخلص. إذا قمت بإضافة المزيد من تحديدات التنسيق إلى printf, أو خيارات إضافية، من الممكن أن يكون لدى تحديد المواصفات في بعض كود ما قبل C99 سلسلة تنسيق تفسر بشكل مختلف.

مع تغيير C99، أنت لا تغير وظيفة printf.

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