C'deki const niteleyicisi ile C ++ 'daki const niteleyicisi arasındaki fark nedir?


9

Boyunca hep şeffaf bir Bulunan yorumunu kullanıcı ait R .. :

C ve C ++ aynı dil değildir. Özellikle, C'nin constC ++ ile ilgisi yoktur const.

Biliyorum, constC constniteleyicisi ve C ++ niteleyicisi arasındaki bir fark varsayılan bağlantı olduğunu.

constC ++ ' da niteleyiciyle ad alanı kapsamında bildirilen bir nesnenin iç bağlantısı, C'de constise global kapsamda (daha staticönce niteleyici olmadan const) bildirilen niteleyicili bir nesnenin dış bağlantısı vardır.

Ama ikisi de C ve C ++ dilleri arasında nasıl farklılıklar gösteriyor? Her iki dilde de her ikisinin de aynı kavram ve amaca sahip olduğunu düşündüm.

Benim sorum:

  • C'deki const niteleyicisi ile C ++ 'daki const niteleyicisi arasındaki fark nedir?

C ve C ++ 'da "const" cevapları nasıl farklılık gösterir? niteleyici bağlamında C ve C ++ dilleri arasında kesin bir fark olduğunu göstermezconst . Sadece belirli bir dilde yapamayacağınız veya yapamayacağınız şey.


Bu kadar çok cevap sadece bir Google araması uzaklıktadır. Bunlardan biri: Stackoverflow.com/questions/4486442/…
schaiba

1
C'de, constbağlantıyla hiçbir ilgisi yoktur. Sen olabilir static const, Dosya kapsamında ve iç bağlantı vardır
Lundin

3
Bu sorunun şu anki cevaplarından memnun değilseniz - ki bu sizinkiyle aynıdır - üzerine bir ödül göndermeyi düşünün.
Sneftel

3
Bağlantılı yinelemenin kötü olduğunu kabul ediyorum. İyi bir cevap tüm farklılıkları listeler ve consther iki dilde de aynı şeyi açıklamaz .
Lundin

1
Böyle bir cevap yazmayı deneyebilirim ama tüm C ++ guru'lardan emin değilim. Başımın üstünde: C ++ 'da const değişkenleri C'nin aksine sabit ifadelerdir. Bahsedilen bağlantı. Başka herhangi bir şey?
Lundin

Yanıtlar:


11
  • En önemli fark, C ++ 'da bir constdeğişkenin sabit bir ifade olmasıdır (C ++ 11'in girişinden önce bile constexpr), ancak constC'deki bir değişken değildir.

    Yani C ++ gibi şeyler yapmanıza const size_t n = 1; static int array[n];izin verir, ancak C, tarihsel nedenlerden dolayı buna izin vermez.

  • C ++ 'da, constbağlantı belirlenmesinde rol oynar. Bu C ++ sürümleri arasında farklıdır. Cppreference.com'a göre (vurgu mayın):

    Ad alanı kapsamında bildirilen aşağıdaki adlardan herhangi birinin dahili bağlantısı vardır:


    • kalıcı olmayan (C ++ 14'ten beri) satır içi olmayan (C ++ 17'den beri) dışa aktarılmayan (C ++ 20'den beri) extern ve aren olarak bildirilmeyen sabit nitelikli değişkenler (constexpr dahil) t önceden dış bağlantıya sahip olduğu beyan edilmiş;

    C de ise, constbağlantıyı belirlemede hiçbir rol oynamaz - sadece beyan kapsamı ve depolama sınıfı belirleyicileri önemlidir.

  • C ++ 'da constüye işlevlerini niteleyebilirsiniz. Üye işlevleri için sözdizimi desteği olmadığından, bu C'de mümkün değildir.

  • C, constnitelenmiş değişkenlerin bir başlatıcı olmadan bildirilmesine izin verir . C const int x;dilinde, başlatıcılar olmadan yazabiliriz , ancak C ++ buna izin vermez. Bir bakışta, bu C'de anlamsız bir dil hatası gibi görünebilir, ancak mantık, bilgisayarların yazılım tarafından değil, donanım tarafından ayarlanan değerlere sahip salt okunur donanım kayıtlarına sahip olmasıdır. Yani C, donanımla ilgili programlama için uygun kalır.


C'de üye işlevleriniz olabilir mi?
Maxim Egorushkin

1
const size_t n = 1; static int array[n];Yalnızca derleyicinin tanımını görebiliyor nve sabit yayılım yapabiliyorsa işe yaradığını unutmayın . extern const size_t n; static int array[n];çalışmıyor.
Maxim Egorushkin

Hm, bu tür donanım kayıtlarının işaretçilerle ele alınmasını tercih ediyorum, örneğin uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua

@Aconcagua Bu tür kayıtları, kayıt haritasının geri kalanıyla uyumsuz hale getirir. Ve bu, bir hata ayıklayıcıdaki gerçek kayıt değerlerini görüntülemenizi nasıl sağlar? Örneğin, hangi kısımla karşılaştığınızı hızlı bir şekilde görmek için salt okunur silikon maske seti kayıtlarını görüntülemek istiyorsanız. Ve tabii ki, volatileişaretçiyi de nitelendirmeniz gerekir .
Lundin

@Lundin Kabul, dikkat etmedi volatile... Gerisi bağlıdır. Bu durumlarda elimde olan hata ayıklayıcılar da kolayca çözülebilir *x. Öte yandan, kayıtlar bazı bellek bölgelerine eşlenirse ve derleyici değişkenleri doğrudan belirli bellek konumlarına yerleştirmeyi desteklemiyorsa (her ikisini de gördüm), değişkeni belirli bir bellek konumuna almak bazen biraz dağınık olabilir (bunu harita dosyasında belirtmek zorunda ...). Sonunda, görevlendirildiğim görevi alabildiğim sürece doğru yerde veya bir göstergede yer alan bir değişkene sahip olmak umurumda değil;)
Aconcagua

0

Gönderen cppreference.com :

constYerel olmayan uçucu olmayan bir şablon olmayan bir beyan kullanılan eleme-olmayan içi bildirilmedi (C ++ 17 beri) değişken (C ++ 14 beri) externverir iç bağlantı. Bu, constdosya kapsamı değişkenlerinin harici bağlantıya sahip olduğu C'den farklıdır .

Bunun dışında constC ve C ++ ve C başlıklarında aynı semantiğe sahip constolanlar genellikle koşullu C ++ başlıkları olarak derlenir "extern C".


1
Kötü bir teklif, basitleştirme. static const x;dosya kapsamındaki C iç bağlantı vardır. Bir C değişkeninin bağlantısı, hangi sınıfta beyan edildiği ve ayrıca depolama sınıfı belirteçlerinin varlığı / yokluğu ile belirlenir. constve diğer tür niteleyiciler bunun bir bölümünü oynamıyor.
Lundin

@Lundin Teklifin söylediklerinden farkı nedir?
Maxim Egorushkin

1
Verdiğim örnek alıntıyı yanlış kanıtlıyor. Alıntıya göre static const x;, C'deki dosya kapsamı dış bağlantıya sahiptir.
Lundin

@Lundin Alıntı int const x = 1, C dilinde dış bağlantı olduğunu söylüyor . Bu nedenle, staticbağlantıyı dahili olarak değiştirmeniz gerekir . Alıntı, yorumlarınızın aksine benim için oldukça açık.
Maxim Egorushkin

1
Gerçekten bunu hiç söylemiyor. Alıntıyı okuyun. "... C sabit dosya kapsam değişkenlerinin dış bağlantıya sahip olduğu".
Lundin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.