منصة SIZE_T تنسيق محددات في C؟
-
22-09-2019 - |
سؤال
أريد طباعة متغير من النوع 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
المعدلات الطول الأخرى المتوفرة hh
(ل char
), h
(ل short
), l
(ل long
), ll
(ل long long
), j
(ل intmax_t
), t
(ل ptrdiff_t
)، و L
(ل long 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);