Apa perbedaan antara kualifikasi const di C dan kualifikasi const di C ++?

9

Saya telah menemukan komentar pengguna R .. :

C dan C ++ bukan bahasa yang sama. Secara khusus, C consttidak ada hubungannya dengan C ++ const.

Saya tahu, bahwa satu perbedaan antara constkualifikasi di C dan constkualifikasi di C ++ adalah tautan defaultnya.

Objek yang dideklarasikan di lingkup namespace dengan constkualifikasi di C ++ memiliki hubungan internal, sedangkan di C objek dengan constkualifikasi dinyatakan di lingkup global (tanpa memiliki statickualifikasi sebelumnya const) memiliki tautan eksternal.

Tapi bagaimana lagi mereka berdua berbeda antara bahasa C dan C ++? Saya pikir keduanya memiliki konsep dan tujuan yang sama dalam kedua bahasa.

Pertanyaan saya:

  • Apa perbedaan antara kualifikasi const di C dan kualifikasi const di C ++?

Jawaban untuk Apa perbedaan "const" dalam C dan C ++? jangan arahkan perbedaan yang tepat antara bahasa C dan C ++ dalam konteks constkualifikasi. Hanya apa yang tidak dapat Anda lakukan atau lakukan dengan bahasa tertentu.

RobertS mendukung Monica Cellio
sumber
Begitu banyak jawaban hanya dengan pencarian Google. Salah satunya: stackoverflow.com/questions/4486442/…
schaiba
1
Di C, consttidak ada hubungannya dengan tautan. Anda dapat memiliki static constpada ruang lingkup file dan memiliki tautan internal,
Lundin
3
Jika Anda tidak puas dengan jawaban saat ini untuk pertanyaan itu - yang sama dengan jawaban Anda - pertimbangkan untuk mengirim hadiah.
Sneftel
3
Saya setuju bahwa duplikat tertaut itu buruk. Jawaban yang bagus akan mencantumkan semua perbedaan dan tidak terlalu menjelaskan apa constyang sama dalam kedua bahasa.
Lundin
1
Saya dapat mencoba untuk menulis jawaban seperti itu tetapi saya tidak cukup dari seorang guru C ++ untuk memastikan saya memiliki semua perbedaan yang dibahas. Di atas kepala saya: variabel const dalam C ++ adalah ekspresi konstan, tidak seperti dalam C. C ++ dapat mengkualifikasi fungsi anggota. Tautan yang disebutkan. Ada yang lain?
Lundin

Jawaban:

11
  • Perbedaan yang paling penting adalah bahwa dalam C ++ suatu constvariabel adalah ekspresi konstan (bahkan sebelum pengenalan C ++ 11 constexpr), tetapi constvariabel dalam C tidak.

    Berarti bahwa C ++ memungkinkan Anda untuk melakukan hal-hal seperti const size_t n = 1; static int array[n];tetapi C tidak mengizinkan itu, konon karena alasan historis.

  • Dalam C ++, constberperan dalam menentukan hubungan. Ini berbeda antara versi C ++. Menurut cppreference.com (penekanan pada saya):

    Setiap nama berikut yang dideklarasikan di lingkup namespace memiliki tautan internal:


    • non-volatile non-template (sejak C ++ 14) non-inline (sejak C ++ 17) variabel yang tidak terkualifikasi (karena C ++ 20) (termasuk constexpr) yang tidak dideklarasikan sebagai eksternal dan bukan t sebelumnya dinyatakan memiliki hubungan eksternal;

    Sedangkan dalam C, consttidak berperan dalam menentukan hubungan sama sekali - hanya ruang lingkup pernyataan dan kelas penypesifikasi yang penting.

  • Di C ++, Anda dapat constmemenuhi syarat fungsi anggota. Ini tidak mungkin di C karena tidak memiliki dukungan sintaks untuk fungsi anggota.

  • C memungkinkan constvariabel yang memenuhi syarat untuk dinyatakan tanpa penginisialisasi. Di C, kita bisa menulis const int x;tanpa inisialisasi, tetapi C ++ tidak mengizinkan itu. Sekilas, ini mungkin tampak seperti bug bahasa yang tidak masuk akal di C, tetapi alasannya adalah bahwa komputer memiliki register perangkat keras hanya-baca dengan nilai yang ditetapkan oleh perangkat keras, bukan perangkat lunak. Berarti C tetap cocok untuk pemrograman yang berhubungan dengan perangkat keras.

Lundin
sumber
Bisakah Anda memiliki fungsi anggota di C?
Maxim Egorushkin
1
Perhatikan bahwa const size_t n = 1; static int array[n];hanya berfungsi jika kompiler dapat melihat definisi ndan melakukan propagasi konstan. extern const size_t n; static int array[n];tidak bekerja
Maxim Egorushkin
Hm, saya lebih suka melihat register perangkat keras yang ditangani melalui pointer, seperti uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua
@Aconcagua Itu akan membuat register seperti itu tidak kompatibel dengan sisa peta register. Dan bagaimana hal itu memungkinkan Anda untuk melihat nilai register aktual dalam debugger? Misalnya jika Anda hanya ingin melihat register set masker silikon read-only untuk melihat dengan cepat bagian apa yang Anda miliki. Dan jelas, Anda juga harus volatilememenuhi syarat pointer.
Lundin
@Lundin Diakui, tidak memperhatikan volatile... Istirahat tergantung. Para pengadu yang saya miliki dalam kasus-kasus ini dapat dengan mudah menyelesaikannya *xjuga. Di sisi lain, jika register dipetakan ke beberapa wilayah memori dan kompiler tidak mendukung penempatan variabel di lokasi memori tertentu secara langsung (saya telah melihat keduanya), mendapatkan variabel di lokasi memori tertentu kadang-kadang bisa menjadi sedikit berantakan (harus menutup itu di file peta ...). Pada akhirnya saya tidak terlalu peduli tentang memiliki variabel yang terletak di tempat yang tepat atau pointer, selama saya bisa mendapatkan tugas yang ditugaskan;)
Aconcagua
0

Dari cppreference.com :

The constkualifikasi digunakan pada deklarasi non-lokal non-volatile non-template (karena C ++ 14) non-inline (karena C ++ 17) variabel yang tidak dideklarasikan externmemberikan linkage internal. Ini berbeda dari C di mana constvariabel lingkup file memiliki hubungan eksternal.

Selain itu constmemiliki semantik yang sama dalam header C dan C ++ dan C dengan constsering dikompilasi sebagai header C ++ dengan kondisional "extern C".

Maxim Egorushkin
sumber
1
Itu kutipan yang buruk, penyederhanaan berlebihan. static const x;pada ruang lingkup file di C memiliki hubungan internal. Keterkaitan variabel C ditentukan oleh ruang lingkup yang dideklarasikan, serta ada / tidaknya penentu kelas penyimpanan. constdan jenis kualifikasi lainnya tidak berperan sama sekali.
Lundin
@Lundin Apa bedanya dengan apa yang dikatakan kutipan?
Maxim Egorushkin
1
Contoh yang saya berikan membuktikan kutipan salah. Menurut kutipan, static const x;pada ruang lingkup file di C memiliki hubungan eksternal.
Lundin
@Lundin Kutipan mengatakan bahwa int const x = 1dalam C memiliki hubungan eksternal . Karenanya, Anda harus staticmengubah tautan ke internal. Kutipannya cukup jelas bagi saya, tidak seperti komentar Anda.
Maxim Egorushkin
1
Benar-benar tidak mengatakan itu sama sekali. Baca kutipannya. "... C di mana variabel lingkup file const memiliki hubungan eksternal".
Lundin