ความแตกต่างระหว่างตัวกำหนดคุณสมบัติ const ใน C และตัวคัดกรอง const ใน C ++ คืออะไร


9

ฉันพบความคิดเห็นของผู้ใช้R .. :

C และ C ++ ไม่ใช่ภาษาเดียวกัน โดยเฉพาะอย่างยิ่ง, C constมีอะไรจะทำอย่างไรกับ C const++

ฉันรู้ว่าความแตกต่างอย่างหนึ่งระหว่างconstqualifier ใน C และconstqualifier ใน C ++ คือการลิงก์เริ่มต้น

วัตถุที่ประกาศที่ขอบเขตเนมสเปซที่constมีตัวระบุใน C ++ มีการเชื่อมโยงภายในขณะที่ C วัตถุที่constมีตัวระบุที่ประกาศที่ขอบเขตทั่วโลก (โดยไม่ต้องมีตัวระบุstaticก่อนหน้าconst) จะมีการเชื่อมโยงภายนอก

แต่พวกเขาต่างกันอย่างไรระหว่างภาษาของ C และ C ++ ฉันคิดว่าทั้งคู่มีแนวคิดและจุดประสงค์ในภาษาทั้งสองแบบเดียวกัน

คำถามของฉัน:

  • ความแตกต่างระหว่างตัวกำหนดคุณสมบัติ const ใน C และตัวคัดกรอง const ใน C ++ คืออะไร

คำตอบของ"const" แตกต่างกันอย่างไรใน C และ C ++ อย่าชี้ความแตกต่างที่แน่นอนระหว่างภาษาของ C และ C ++ ในบริบทของตัวconstระบุ เฉพาะสิ่งที่คุณไม่สามารถทำได้หรือสามารถทำได้ในบางภาษา


มีคำตอบมากมายเหลือเกินจากการค้นหาโดย Google หนึ่งในนั้น: stackoverflow.com/questions/4486442/…
schaiba

1
ใน C constไม่มีอะไรเกี่ยวข้องกับการเชื่อมโยง คุณสามารถมีstatic constที่ขอบเขตไฟล์และมีการเชื่อมโยงภายใน
Lundin

3
หากคุณไม่พึงพอใจกับคำตอบปัจจุบันสำหรับคำถามนั้น - ซึ่งเหมือนกับคำถามของคุณ - ลองโพสต์เงินรางวัล
Sneftel

3
ฉันยอมรับว่าสำเนาที่เชื่อมโยงนั้นไม่ดี คำตอบที่ดีจะรายการทั้งหมดของความแตกต่างและไม่มากอธิบายสิ่งที่constไม่เหมือนกันทั้งสองภาษา
Lundin

1
ฉันสามารถพยายามเขียนคำตอบนั้นได้ แต่ฉันก็ยังไม่เพียงพอสำหรับกูรู C ++ เพื่อให้แน่ใจว่าฉันมีความแตกต่างทั้งหมดที่กล่าวไว้ ที่ด้านบนของหัวของฉัน: ตัวแปร const ใน C ++ เป็นนิพจน์คงที่ซึ่งแตกต่างจากใน C C ++ สามารถ const ฟังก์ชั่นสมาชิกที่มีคุณสมบัติ การเชื่อมโยงดังกล่าว มีอะไรอีกไหม
Lundin

คำตอบ:


11
  • ความแตกต่างที่สำคัญที่สุดคือใน C ++ constตัวแปรคือนิพจน์คงที่ (แม้ก่อนหน้าการแนะนำของ C ++ 11 constexpr) แต่constตัวแปรใน C ไม่ใช่

    ความหมายที่ C ++ อนุญาตให้คุณทำสิ่งที่ชอบconst size_t n = 1; static int array[n];แต่ C ไม่อนุญาตให้ทำเช่นนั้นเนื่องจากเหตุผลทางประวัติศาสตร์

  • ใน C ++ มีconstส่วนร่วมในการกำหนดความเชื่อมโยง สิ่งนี้แตกต่างระหว่างเวอร์ชัน C ++ ตามcppreference.com (เหมืองที่เน้น):

    ชื่อต่อไปนี้ที่ประกาศที่ขอบเขตเนมสเปซมีการเชื่อมโยงภายใน:


    • non-volatile non-template (ตั้งแต่ C ++ 14) non-inline (ตั้งแต่ C ++ 17) non-export (ตั้งแต่ C ++ 20) ตัวแปรที่ผ่านการรับรอง const (รวมถึง constexpr) ที่ไม่ได้ประกาศภายนอกและ aren ' t ก่อนหน้านี้ประกาศว่าจะมีการเชื่อมโยงภายนอก

    ในขณะที่ C constไม่ได้มีส่วนร่วมในการกำหนดความเชื่อมโยง แต่อย่างใด - ขอบเขตการประกาศเท่านั้นและตัวระบุคลาสการจัดเก็บข้อมูลมีความสำคัญ

  • ใน C ++ คุณสามารถconstมีสิทธิ์ได้สมาชิกฟังก์ชั่น สิ่งนี้เป็นไปไม่ได้ใน C เนื่องจากไม่มีการรองรับไวยากรณ์สำหรับฟังก์ชันสมาชิก

  • C อนุญาตให้constประกาศตัวแปรที่ผ่านการรับรองโดยไม่มี initializer ใน C เราสามารถเขียนได้const int x;โดยไม่มี initializers แต่ C ++ ไม่อนุญาต โดยสรุปแล้วนี่อาจดูเหมือนข้อบกพร่องทางภาษาที่ไม่มีเหตุผลใน C แต่เหตุผลก็คือคอมพิวเตอร์มีการลงทะเบียนฮาร์ดแวร์แบบอ่านอย่างเดียวด้วยค่าที่กำหนดโดยฮาร์ดแวร์ไม่ใช่ซอฟต์แวร์ ความหมายที่ C ยังคงเหมาะสมสำหรับการเขียนโปรแกรมที่เกี่ยวข้องกับฮาร์ดแวร์


คุณมีฟังก์ชั่นสมาชิกใน C ได้ไหม?
Maxim Egorushkin

1
โปรดทราบว่าconst size_t n = 1; static int array[n];จะใช้งานได้เฉพาะเมื่อคอมไพเลอร์สามารถดูคำจำกัดความnและทำการแพร่กระจายอย่างต่อเนื่อง extern const size_t n; static int array[n];ไม่ทำงาน
Maxim Egorushkin

หืมมฉันเห็นว่าเครื่องลงทะเบียนยากถูกแก้ไขผ่านตัวชี้เช่นuint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua

@Aconcagua นั่นจะทำให้รีจิสเตอร์ดังกล่าวเข้ากันไม่ได้กับแผนที่ที่เหลือ และวิธีการที่ช่วยให้คุณดูค่าการลงทะเบียนจริงในดีบักเกอร์ได้อย่างไร ตัวอย่างเช่นหากคุณต้องการดูชุดหน้ากากแบบอ่านอย่างเดียวซิลิคอนเพื่อลงทะเบียนอย่างรวดเร็วเพื่อดูว่าส่วนใดที่คุณจบลงด้วย และแน่นอนคุณต้องvolatileมีคุณสมบัติของตัวชี้ด้วย
Lundin

@Lundin ยอมรับไม่ได้ใส่ใจกับvolatile... ส่วนที่เหลือขึ้นอยู่กับ นักแก้ปัญหาที่ฉันมีด้วยมือในกรณีเหล่านี้สามารถแก้ไขได้อย่างง่ายดาย*xเช่นกัน ในทางกลับกันถ้ารีจิสเตอร์ถูกแมปไปยังพื้นที่หน่วยความจำบางส่วนและคอมไพเลอร์ไม่สนับสนุนการวางตัวแปรที่ตำแหน่งหน่วยความจำเฉพาะโดยตรง (ฉันเคยเห็นทั้งคู่) การรับตัวแปรที่ตำแหน่งหน่วยความจำเฉพาะบางครั้งอาจทำให้ยุ่ง (ต้องครอบคลุมในไฟล์แผนที่ ... ) ในท้ายที่สุดฉันไม่สนใจเกี่ยวกับการตั้งค่าตัวแปรให้ถูกที่หรือตัวชี้ตราบใดที่ฉันสามารถทำงานให้เสร็จได้;)
Aconcagua

0

จากcppreference.com :

constรอบคัดเลือกที่ใช้ในการประกาศของนอกท้องถิ่นไม่ระเหยที่ไม่ใช่แม่แบบ (ตั้งแต่ C ++ 14) ไม่ใช่แบบอินไลน์ (ตั้งแต่ C ++ 17) ตัวแปรที่ไม่ได้ประกาศexternให้มันเชื่อมโยงภายใน สิ่งนี้แตกต่างจาก C ที่constตัวแปรขอบเขตไฟล์มีการเชื่อมโยงภายนอก

อื่น ๆ กว่าที่constมีความหมายเหมือนกันใน C และ C ++ และ C ส่วนหัวที่มีconstมักจะถูกรวบรวมเป็น C ++ "extern C"ส่วนหัวที่มีเงื่อนไข


1
มันเป็นคำพูดที่ไม่ดี static const x;at file scope ใน C มีการเชื่อมโยงภายใน การเชื่อมโยงของตัวแปร C จะถูกกำหนดโดยขอบเขตที่ประกาศไว้รวมถึงการมี / ไม่มีตัวระบุคลาสหน่วยเก็บข้อมูล constและตัวระบุประเภทอื่นไม่ได้มีส่วนร่วมเลย
Lundin

@Lundin มันแตกต่างจากที่พูดอย่างไร?
Maxim Egorushkin

1
ตัวอย่างที่ฉันเพิ่งให้พิสูจน์ข้อผิดพลาด ตามคำพูดstatic const x;ที่ขอบเขตไฟล์ใน C มีการเชื่อมโยงภายนอก
Lundin

@Lundin อ้างบอกว่าint const x = 1ใน C มีการเชื่อมโยงภายนอก ดังนั้นคุณจะต้องstaticเปลี่ยนการเชื่อมโยงเป็นภายใน คำพูดค่อนข้างชัดเจนสำหรับฉันซึ่งแตกต่างจากความคิดเห็นของคุณ
Maxim Egorushkin

1
มันไม่ได้พูดอย่างนั้นจริงๆ อ่านคำพูด "... C โดยที่ตัวแปรขอบเขตไฟล์ const มีการเชื่อมโยงภายนอก"
Lundin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.