อะไรคือความแตกต่างระหว่างsize_t
และstd::size_t
ในแง่ของที่พวกเขาจะประกาศเมื่อใดที่พวกเขาควรจะใช้และคุณสมบัติที่แตกต่างอื่น ๆ ?
อะไรคือความแตกต่างระหว่างsize_t
และstd::size_t
ในแง่ของที่พวกเขาจะประกาศเมื่อใดที่พวกเขาควรจะใช้และคุณสมบัติที่แตกต่างอื่น ๆ ?
คำตอบ:
C size_t
และ C ++ std::size_t
เหมือนกันทั้งคู่
ใน C มันถูกกำหนดไว้ใน<stddef.h>
และใน C ++ มันถูกกำหนดไว้ใน<cstddef>
เนื้อหาที่เป็นเช่นเดียวกับส่วนหัว C (ดูใบเสนอราคาด้านล่าง) ที่กำหนดไว้ในฐานะที่เป็นชนิดจำนวนเต็มไม่ได้ลงนามในผลของsizeofผู้ประกอบการ
C Standard กล่าวใน§17.7 / 2
size_t ซึ่งเป็นประเภทเลขจำนวนเต็มที่ไม่ได้ลงนามของผลลัพธ์ของตัวดำเนินการsizeof
และมาตรฐาน C ++ บอกว่า (ประมาณcstddef
ส่วนหัว) ใน§18.1 / 3
เนื้อหาเป็นเช่นเดียวกับส่วนหัวของห้องสมุดมาตรฐาน C, กับการเปลี่ยนแปลงดังต่อไปนี้
ดังนั้นใช่ทั้งคู่เหมือนกัน ข้อแตกต่างเพียงอย่างเดียวคือ C ++ กำหนดsize_t
ในstd
เนมสเปซ
โปรดแจ้งให้ทราบว่าเส้นดังกล่าวข้างต้นนอกจากนี้ยังกล่าวว่า"กับการเปลี่ยนแปลงต่อไป"size_t
ซึ่งไม่ได้หมายถึง มันค่อนข้างหมายถึงการเพิ่มใหม่ (ส่วนใหญ่) ทำโดย C ++ เป็นภาษา (ไม่อยู่ใน C) ซึ่งจะถูกกำหนดไว้ในส่วนหัวเดียวกัน
Wikipedia มีข้อมูลที่ดีมากเกี่ยวกับช่วงและขนาดการเก็บข้อมูล size_t:
ช่วงและขนาดการจัดเก็บของ size_t
จริงประเภทของ size_t คือ ขึ้นอยู่กับแพลตฟอร์ม ; ผิดพลาด คือการสมมติ size_t เป็นเช่นเดียวกับ int ไม่ได้ลงนามซึ่งสามารถนำไปสู่การเขียนโปรแกรมข้อผิดพลาด [3] [4] เมื่อย้ายจาก 32 สถาปัตยกรรม 64 บิตตัวอย่างเช่น
ตามมาตรฐาน ISO 1999 C (C99) size_t เป็นประเภทจำนวนเต็มที่ไม่ได้ลงนามอย่างน้อย 16 บิต
และที่เหลือคุณสามารถอ่านจากหน้านี้ได้ที่วิกิพีเดีย
size_t
โดยไม่ได้หรือusing namespace std;
using std::size_t;
อย่างไรก็ตามคอมไพเลอร์ส่วนใหญ่อนุญาตให้ทำได้และมาตรฐานอนุญาตให้พวกเขาอนุญาตเฉพาะ (§D.5 / 3)
<cstddef>
อาจหรืออาจไม่ประกาศ::size_t
ดังนั้นคุณจึงไม่สามารถพึ่งพาได้ว่าอยู่ที่นั่นหรือไม่อยู่เว้นแต่ว่าจะรวมถึง<stddef.h>
หรือส่วนหัวอื่น ๆ จากไลบรารี C ซึ่งรับประกันว่าจะประกาศ
::size_t
มีอยู่เช่นใน<stddef.h>
ดังนั้นคุณไม่จำเป็นต้องมีคุณสมบัติด้วยstd::
เสมอ
จาก C ++ 03 "17.4.3.1.4 ประเภท":
สำหรับแต่ละประเภท T จากไลบรารี C มาตรฐาน (เชิงอรรถ 169), ประเภท :: T และ std :: T จะถูกสงวนไว้สำหรับการนำไปใช้และเมื่อกำหนดแล้ว :: T จะเหมือนกับ std :: T
และเชิงอรรถ 169:
ชนิดเหล่านี้คือ clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t, ptrdiff_t, sig_atomic_t, size_t, time_t, tm, vct_t, wctrans_t, wctrans_t และ wint_t
std::T
ตัวแปรที่กำหนดไว้?
#include <stddef.h>
แล้วstd::size_t
อาจจะหรืออาจจะไม่สามารถใช้ได้ หากคุณ#include <cstddef>
แล้วstd::size_t
สามารถใช้ได้ แต่size_t
อาจจะไม่ได้
std::
และย่อหน้าบอกว่ามันอาจกำหนดไว้ในเนมสเปซระดับบนสุดและหากเป็นเช่นนั้นจะต้องกำหนดให้เหมือนกันในstd::
ระดับบนสุด คอมไพเลอร์ส่วนใหญ่มีเพียงส่วนหัว C และนำเข้าชื่อstd::
ดังนั้นสัญลักษณ์จะถูกกำหนดในทั้งสอง
std::
ตัวแปรของตัวระบุที่มาจากฝั่ง C ฉันติดกับ<xxxxx.h>
ส่วนหัว C มาตรฐาน - มันไม่เคยมีปัญหา ดังนั้นฉันต้องการใช้<stddef.h>
และsize_t
และไม่เคยให้ความคิดที่สองที่จะstd::size_t
; ในความเป็นจริงมันไม่เคยข้ามใจของฉันที่มี std::size_t
(หรืออาจจะมีบริการ)
มาตรฐาน :: size_tในความเป็นจริงstddef.h 's size_t
cstddefให้สิ่งต่อไปนี้:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... นำคำจำกัดความก่อนหน้านี้เข้าสู่เนมสเปซอย่างมีประสิทธิภาพ
<cstddef>
และคาดว่าจะได้รับ::size_t
แต่ถ้าคุณรวมถึงคุณจะได้รับ<stddef.h>
std::size_t
<stddef.h>
จะได้รับคุณ::size_t
เท่านั้น
<cstddef>
คุณจะได้รับการรับประกันstd::size_t
และคุณอาจได้รับ::size_t
(แต่ไม่รับประกัน) หากคุณรวม<stddef.h>
คุณรับประกันว่าจะได้รับ::size_t
และคุณอาจได้รับstd::size_t
(แต่ไม่รับประกัน) มันแตกต่างใน C ++ 03 แต่มันไม่สามารถใช้งานได้อย่างมีประสิทธิภาพและแก้ไขเป็นข้อบกพร่อง