سؤال

أريد طباعة متغير من النوع size_t في C ولكن يبدو ذلك size_t مسموع لأنواع متغيرة مختلفة في بنيات مختلفة. على سبيل المثال ، على جهاز واحد (64 بت) لا يرمي الرمز التالي أي تحذيرات:

size_t size = 1;
printf("the size is %ld", size);

ولكن على الجهاز الآخر الخاص بي (32 بت) ، ينتج الرمز أعلاه رسالة التحذير التالية:

تحذير: يتوقع التنسيق '٪ ld' النوع 'long int *' ، ولكن الوسيطة 3 لها نوع 'size_t *'

أظن أن هذا يرجع إلى الفرق في حجم المؤشر ، بحيث على جهاز 64 بت الخاص بي size_t مسموع إلى أ long int ("%ld") ، بينما على جهاز 32 بت size_t المستعار لنوع آخر.

هل هناك تنسيق محدد على وجه التحديد ل size_t?

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

المحلول

نعم: استخدم z المعدل الطول:

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size);  // hex size_t

المعدلات الطول الأخرى المتوفرة hhchar), hshort), llong), lllong long), jintmax_t), tptrdiff_t)، و Llong double). انظر §7.19.6.1 (7) من معيار C99.

نصائح أخرى

نعم هنالك. أنه %zu (كما هو محدد في ANSI C99).

size_t size = 1;
printf("the size is %zu", size);

لاحظ أن size_t غير موقعة ، وبالتالي %ld مخطئ مزدوج: معدّل الطول الخاطئ ومواصفات تحويل التنسيق الخاطئ. في حال كنت تتساءل ، %zd هو ل ssize_t (الذي تم توقيعه).

MSDN, ، يقول أن Visual Studio يدعم بادئة "I" للرمز المحمول على منصات 32 و 64 بت.

size_t size = 10;
printf("size is %Iu", size);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top