ฉันมักจะเห็นซอร์สโค้ดโดยใช้ประเภทเช่น uint32, uint64 และฉันสงสัยว่าควรกำหนดโดยโปรแกรมเมอร์ในรหัสแอปพลิเคชันหรือหากกำหนดไว้ในส่วนหัว lib มาตรฐาน
อะไรคือวิธีที่ดีที่สุดในการมีประเภทเหล่านี้ในซอร์สโค้ดแอปพลิเคชันของฉัน
ฉันมักจะเห็นซอร์สโค้ดโดยใช้ประเภทเช่น uint32, uint64 และฉันสงสัยว่าควรกำหนดโดยโปรแกรมเมอร์ในรหัสแอปพลิเคชันหรือหากกำหนดไว้ในส่วนหัว lib มาตรฐาน
อะไรคือวิธีที่ดีที่สุดในการมีประเภทเหล่านี้ในซอร์สโค้ดแอปพลิเคชันของฉัน
คำตอบ:
C99 stdint.h
กำหนดสิ่งเหล่านี้:
int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t
และหากสถาปัตยกรรมรองรับ:
int64_t
uint64_t
มีตัวพิมพ์จำนวนเต็มอื่น ๆ ด้วยstdint.h
เช่นกัน
หากคุณติดอยู่โดยไม่มีสภาพแวดล้อม C99 คุณควรจัดหา typedef ของคุณเองและใช้ C99 ต่อไป
uint32
และuint64
(เช่นโดยไม่ต้อง_t
ต่อท้าย) อาจจะเป็นเฉพาะของโปรแกรม
stdint.h
ต้องการพวกเขาทั้งหมด
typedef uint32_t Uint32;
ในนามแฝงใน include / SDL_stdinc.h (ถ้าคุณเป็นผู้ใช้ SDL)
ประเภทจำนวนเต็มเหล่านี้ถูกกำหนดไว้ทั้งหมดใน stdint.h
stdint.h
ถ้าคุณเคารพมาตรฐาน C99
stdint.h
ของพวกเขาใน นี้จะส่งกลับ 0 grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t
ยอดนิยม:
#include "stdint-gcc.h"
และการ grepping ไฟล์นั้นให้คำจำกัดความ
_t
คำต่อท้ายตามที่ระบุไว้ในคำตอบด้านบน
หากคุณใช้ C99 เพียงแค่ใส่stdint.h
. BTW ประเภท 64 บิตอยู่ที่นั่นหากโปรเซสเซอร์รองรับ
uint128_t
if __SIZEOF_INT128__
กำหนดเป็น 16 หรือสูงกว่า (GCC และเข้ากันได้) มีอยู่ในเครื่อง x86_64 / amd64 แต่โปรเซสเซอร์ไม่รองรับโดยกำเนิด เฉพาะ Cray's เท่านั้นที่มีขนาดการลงทะเบียน IIRC
ผู้ถามถามจริงเกี่ยวกับ int16 (ฯลฯ ) มากกว่า (น่าเกลียด) int16_t (ฯลฯ )
ไม่มีส่วนหัวมาตรฐาน - หรือในโฟลเดอร์ / usr / include / ของ Linux ที่กำหนดโดยไม่มี "_t"
int_leastNN_t
และuint_leastNN_t
สำหรับNN
8, 16, 32, และ 64 ต้องอยู่เสมอ C99 ไม่อนุญาตให้ใช้งานที่ไม่มีประเภทจำนวนเต็มอย่างน้อย 64 บิตเนื่องจากlong long
จำเป็นต้องมีขนาดใหญ่เป็นอย่างน้อย