Saya telah menemukan komentar pengguna R .. :
C dan C ++ bukan bahasa yang sama. Secara khusus, C
const
tidak ada hubungannya dengan C ++const
.
Saya tahu, bahwa satu perbedaan antara const
kualifikasi di C dan const
kualifikasi di C ++ adalah tautan defaultnya.
Objek yang dideklarasikan di lingkup namespace dengan const
kualifikasi di C ++ memiliki hubungan internal, sedangkan di C objek dengan const
kualifikasi dinyatakan di lingkup global (tanpa memiliki static
kualifikasi 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 const
kualifikasi. Hanya apa yang tidak dapat Anda lakukan atau lakukan dengan bahasa tertentu.
sumber
const
tidak ada hubungannya dengan tautan. Anda dapat memilikistatic const
pada ruang lingkup file dan memiliki tautan internal,const
yang sama dalam kedua bahasa.Jawaban:
Perbedaan yang paling penting adalah bahwa dalam C ++ suatu
const
variabel adalah ekspresi konstan (bahkan sebelum pengenalan C ++ 11constexpr
), tetapiconst
variabel 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 ++,
const
berperan dalam menentukan hubungan. Ini berbeda antara versi C ++. Menurut cppreference.com (penekanan pada saya):Sedangkan dalam C,
const
tidak berperan dalam menentukan hubungan sama sekali - hanya ruang lingkup pernyataan dan kelas penypesifikasi yang penting.Di C ++, Anda dapat
const
memenuhi syarat fungsi anggota. Ini tidak mungkin di C karena tidak memiliki dukungan sintaks untuk fungsi anggota.C memungkinkan
const
variabel yang memenuhi syarat untuk dinyatakan tanpa penginisialisasi. Di C, kita bisa menulisconst 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.sumber
const size_t n = 1; static int array[n];
hanya berfungsi jika kompiler dapat melihat definisin
dan melakukan propagasi konstan.extern const size_t n; static int array[n];
tidak bekerjauint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);
...volatile
memenuhi syarat pointer.volatile
... Istirahat tergantung. Para pengadu yang saya miliki dalam kasus-kasus ini dapat dengan mudah menyelesaikannya*x
juga. 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;)Dari cppreference.com :
Selain itu
const
memiliki semantik yang sama dalam header C dan C ++ dan C denganconst
sering dikompilasi sebagai header C ++ dengan kondisional"extern C"
.sumber
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.const
dan jenis kualifikasi lainnya tidak berperan sama sekali.static const x;
pada ruang lingkup file di C memiliki hubungan eksternal.int const x = 1
dalam C memiliki hubungan eksternal . Karenanya, Anda harusstatic
mengubah tautan ke internal. Kutipannya cukup jelas bagi saya, tidak seperti komentar Anda.