คำถามติดแท็ก size-t

13
size_t ใน C คืออะไร
ฉันกำลังสับสนกับsize_tใน C. ฉันรู้ว่ามันจะถูกส่งกลับโดยsizeofผู้ประกอบการ แต่มันคืออะไรกันแน่? เป็นประเภทข้อมูลหรือไม่ สมมติว่าฉันมีforลูป: for(i = 0; i < some_size; i++) ฉันควรใช้int i;หรือsize_t i;?
626 c  int  size-t 

8
int กับ size_t ที่ไม่ได้ลงชื่อ
ฉันสังเกตว่ารหัส C และ C ++ ที่ทันสมัยดูเหมือนว่าจะใช้size_tแทนint/ unsigned intสวยมากทุกที่ - จากพารามิเตอร์สำหรับฟังก์ชันสตริง C ถึง STL ฉันอยากรู้ว่าเหตุผลนี้และประโยชน์ที่จะได้รับ
492 c++  c  size-t 

7
size_t เทียบกับ uintptr_t
มาตรฐาน C รับประกันว่าsize_tเป็นประเภทที่สามารถเก็บดัชนีอาร์เรย์ใด ๆ ซึ่งหมายความว่ามีเหตุผลsize_tควรจะสามารถเก็บตัวชี้ใด ๆ ฉันได้อ่านในเว็บไซต์บางแห่งที่ฉันพบใน Googles ว่าถูกกฎหมายและ / หรือควรทำงาน: void *v = malloc(10); size_t s = (size_t) v; ดังนั้นใน C99 มาตรฐานแนะนำintptr_tและuintptr_tประเภทซึ่งลงนามและไม่ได้ลงนามประเภทรับประกันว่าจะสามารถเก็บพอยน์เตอร์: uintptr_t p = (size_t) v; ดังนั้นความแตกต่างระหว่างการใช้size_tและuintptr_tคืออะไร? ทั้งสองแบบไม่ได้ลงนามและทั้งคู่ควรจะสามารถถือตัวชี้ประเภทใดก็ได้ มีเหตุผลที่น่าสนใจจริง ๆuintptr_tหรือไม่ที่จะใช้(หรือดีกว่า, a void *) มากกว่า a size_t, มากกว่าความชัดเจน? ในโครงสร้างทึบซึ่งเขตข้อมูลจะถูกจัดการโดยฟังก์ชันภายในเท่านั้นมีเหตุผลใดที่จะไม่ทำเช่นนี้หรือไม่? ด้วยโทเค็นเดียวกันptrdiff_tมีชนิดที่มีลายเซ็นสามารถถือความแตกต่างของตัวชี้ได้และดังนั้นจึงสามารถจับตัวชี้ส่วนใหญ่ได้ดังนั้นจึงแตกต่างจากintptr_tอย่างไร ไม่ทุกประเภทเหล่านี้โดยทั่วไปให้บริการฟังก์ชั่นรุ่นเดียวกันที่แตกต่างกันเล็กน้อย? ถ้าไม่ทำไม ฉันไม่สามารถทำอะไรกับหนึ่งในนั้นที่ฉันไม่สามารถทำกับคนอื่นได้? ถ้าเป็นเช่นนั้นเหตุใด C99 จึงเพิ่มประเภทฟุ่มเฟือยสองประเภทลงในภาษา ฉันยินดีที่จะเพิกเฉยต่อพอยน์เตอร์ของฟังก์ชั่นเนื่องจากมันไม่ได้ใช้กับปัญหาปัจจุบัน แต่อย่าลังเลที่จะพูดถึงมันเนื่องจากฉันมีความสงสัยที่ด้อมพวกเขาจะเป็นศูนย์กลางของคำตอบที่ "ถูกต้อง"
246 c  pointers  size-t 

13
เมื่อใดที่จะใช้ std :: size_t?
ฉันแค่สงสัยว่าฉันควรใช้std::size_tกับลูปและสิ่งของแทนได้intอย่างไร ตัวอย่างเช่น #include <cstdint> int main() { for (std::size_t i = 0; i < 10; ++i) { // std::size_t OK here? Or should I use, say, unsigned int instead? } } โดยทั่วไปแล้ววิธีปฏิบัติที่ดีที่สุดเกี่ยวกับเวลาที่ใช้std::size_tคืออะไร


9
ทำความสะอาดโค้ดเพื่อ printf size_t ใน C ++ (หรือ: ใกล้เคียงที่สุดกับ C99 ของ% z ใน C ++)
ฉันมีรหัส C ++ ที่พิมพ์size_t: size_t a; printf("%lu", a); ฉันต้องการให้สิ่งนี้รวบรวมโดยไม่มีคำเตือนทั้งในสถาปัตยกรรม 32- และ 64 บิต ถ้าเป็น C99 ฉันสามารถprintf("%z", a);ใช้ได้ แต่ AFAICT %zไม่มีอยู่ในภาษา C ++ มาตรฐานใด ๆ ดังนั้นฉันต้องทำแทน printf("%lu", (unsigned long) a); ซึ่งน่าเกลียดจริงๆ หากไม่มีสิ่งอำนวยความสะดวกสำหรับการพิมพ์size_tในภาษาฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะเขียน printf wrapper หรือบางอย่างเช่นนั้นจะแทรก casts ที่เหมาะสมลงในsize_ts เพื่อกำจัดคำเตือนของคอมไพเลอร์ปลอมในขณะที่ยังคงรักษาสิ่งที่ดีไว้ ความคิดใด ๆ ? แก้ไขเพื่อชี้แจงว่าเหตุใดฉันจึงใช้ printf: ฉันมีฐานรหัสที่ค่อนข้างใหญ่ซึ่งฉันกำลังทำความสะอาด มันใช้ printf wrapper เพื่อทำสิ่งต่างๆเช่น "เขียนคำเตือนบันทึกลงในไฟล์และอาจออกจากโค้ดด้วยข้อผิดพลาด" ฉันอาจรวบรวม C …
96 c++  printf  size-t 

3
ตัวระบุรูปแบบ size_t อิสระของแพลตฟอร์มใน c?
ฉันต้องการพิมพ์ตัวแปรประเภทsize_tC แต่ปรากฏว่าsize_tมีการใช้นามแฝงเป็นตัวแปรประเภทต่างๆในสถาปัตยกรรมที่แตกต่างกัน ตัวอย่างเช่นในเครื่องเดียว (64 บิต) รหัสต่อไปนี้จะไม่แสดงคำเตือนใด ๆ : size_t size = 1; printf("the size is %ld", size); แต่ในเครื่องอื่นของฉัน (32 บิต) รหัสด้านบนจะสร้างข้อความเตือนต่อไปนี้: คำเตือน: รูปแบบ '% ld' คาดว่าจะเป็นประเภท 'long int *' แต่อาร์กิวเมนต์ 3 มีประเภท 'size_t *' ฉันสงสัยว่านี่เป็นเพราะความแตกต่างของขนาดตัวชี้ดังนั้นบนเครื่อง 64 บิตของฉันsize_tจึงมีนามแฝงเป็น a long int( "%ld") ในขณะที่เครื่อง 32 บิตของฉันsize_tมีนามแฝงเป็นประเภทอื่น มีตัวระบุรูปแบบสำหรับsize_tหรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.