ฉันมีตัวแปรของชนิดและฉันต้องการที่จะพิมพ์โดยใช้size_t
printf()
ฉันใช้ตัวระบุรูปแบบใดเพื่อพิมพ์แบบพกพา
ในเครื่อง 32- บิต%u
ดูเหมือนว่าถูกต้อง ฉันรวบรวมg++ -g -W -Wall -Werror -ansi -pedantic
และไม่มีคำเตือน แต่เมื่อฉันรวบรวมรหัสนั้นในเครื่อง 64 บิตมันจะสร้างคำเตือน
size_t x = <something>;
printf("size = %u\n", x);
warning: format '%u' expects type 'unsigned int',
but argument 2 has type 'long unsigned int'
%lu
คำเตือนออกไปตามที่คาดไว้ถ้าเปลี่ยนที่
คำถามคือฉันจะเขียนรหัสได้อย่างไรเพื่อรวบรวมคำเตือนฟรีทั้งบนเครื่อง 32- และ 64- บิต?
แก้ไข: ในฐานะที่เป็นวิธีแก้ปัญหาผมคิดว่าหนึ่งคำตอบที่อาจจะมีการ "โยน" ตัวแปรลงในจำนวนเต็มที่เป็นพอใหญ่พูดและพิมพ์โดยใช้unsigned long
%lu
ที่จะทำงานในทั้งสองกรณี ฉันกำลังมองหาว่ามีความคิดอื่น ๆ
unsigned long
เป็นตัวเลือกที่ดีที่สุดหากการใช้งาน libc ของคุณไม่สนับสนุนz
ตัวปรับ มาตรฐาน C99size_t
ไม่แนะนำให้มีการแปลงเป็นจำนวนเต็มมากกว่าlong
ดังนั้นคุณจึงปลอดภัยพอสมควร