C++ derleyicilerinin const doğruluğunu sağlamak için bu yardımı sağladığına dair herhangi bir uyarı bilen var mı? Örneğin, yöntemin içinde hiç değiştirilmeyen bir const parametresi içeren herhangi bir C++ yöntemi tarafından üretilen bir uyarının olması güzel olurdu. Ben -Wsuggest-attribute = const adlı bir gnu derleyici uyarı olduğunu görüyorum; Ancak, bu bayrağı kullandığımda, tanınmadığını söyleyen bir hata alıyorum. Herhangi bir fikir neden?Kesin doğruluk uyarıları C++
cevap
Böyle bir uyarı olduğunu düşünmüyorum, çünkü çoğunlukla işe yaramıyordu. Sadece bir parametre aramanın içinde değiştirilmediğinden, sadece bunun için const
yapılması gerektiği anlamına gelmez.
virtual
işlevlerini düşünün. Baz sınıfın tasarımcısı, belki de, temel sınıftaki parametreyi değiştirmese de, bu parametreyi değiştirip değiştirmeyeceklerini ya da değiştirmemek için bir genişletme sınıfına bırakmak ister. Ayrıca, arayüzleri veya API'leri ya da her ne pahasına olursa olsun maliyetleri değiştiren büyük uygulamaları düşünün. Şimdi parametreyi değiştirmenize gerek olmayabilir, ancak gelecekte bunu yapmayı düşünebilirsiniz. const
şimdi yapmayacaksınız ve const
'u kaldırdığınızda, tam bir yeniden oluşturma ve muhtemelen gelecekte hata riskini zorlamayacaksınız.
Ben senin noktanı görüyorum; Ancak, bunun bir uyarı olarak faydalı olacağını düşünüyorum (belki de bir hata değil). Ayrıca, gw derleyici için -Wsuggest-attribute = const; ama g ++ derleyicim bunu tanımıyor. – user809409
Bir derleyicide çalışmayı bırakacağım bir özellik değil, her şeyi şimdi açmak ve önerileri incelemek güzel olurdu. Bir fonksiyonun bir değişkeni değiştirmeyeceğini biliyorsanız, const değişkenlerinin girilmesine izin verdiğinden const yapmak için iyi bir uygulamadır. – Darinth
[Rust] (https://www.rust-lang.org/en -US /) bu özelliğe (gereksiz 'mut') sahiptir ve C++ 'ya dönmeyi özlediğim ve API'lerin ve yerel değişkenlerin varsayılan olarak değişmez olduğundan emin olmaya çalışıyorum. – phoenix
Hayır, maalesef böyle bir uyarı yok. Yalnızca const tarafından bildirilen parametreleri değiştirmeye çalışırsanız hata alırsınız. Bunun nedeni, eksik const
bildirimlerinin, derleyicilerin bakış açısından kodun doğruluğunu değiştirmemesidir. Fakat const doğruluğu, derleyicinin potansiyel optimizasyonları keşfetmesi için önemlidir ve kodun okunabilirliğini geliştirir. Bu bir profesyonellik meselesidir. Özellikle referansları kullanırken const doğruluğu bir zorunluluktur. I often refer to this.
Operatörler (atama, dönüştürme, ...) devreye girdiklerinde, derleyicinin kendisi const doğruluğunu çok ciddiye alır. Burada eksik olan bir const
ve derleyici, operatörü kullanmayı reddeder çünkü verilen parametre değiştirilip değiştirilmediğinde büyük bir fark yaratır.
Dikkatli ol, böyle bir const
parametre:
void myFunc(int const param);
değil arabirimine ait olmalı. Bu, uygulamasının işlevinin yerel kapsamına aittir. Aslında, bu işlevi:
int inc(int const param) { return param+1; }
Bir değişkeni değiştirme hakkını iddia const doğruluğu paradigmasının ihlali değildir
int inc(int param);
olduğu bildirilen, ancak gerçekte yapmaz olabilir. Eğer kod tabanı bunun için
grep
ilk etapta kullanmak ya da sadece edemez ya
const_cast
hakkında endişe duyuyorsanız
.
Bu tür uyarıların farkında değilim ve bir derleyicide uygulamak oldukça zor olacağını düşünüyorum - yani, yavaşlatırlar. Belki bazı statik analiz araçları bu özelliklere sahiptir (fakat ben bunların farkında değilim).
Wsuggest-attribute=const
'a göre, bu farklı bir şeydir. Temel olarak, bir matematiksel fonksiyon, sadece değerleri (işaretçi yok) alma, herhangi bir statik/global durumu okuma ve değiştirme ve sadece bir değer döndürme (işaretçi yok) olan gcc'ye özgü "işlev özniteliği const
" kullanılmasını önerir. .Daha fazla açıklama için, buraya bakın: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
-Wsuggest-attribute=const
Bu analiz de varsayılan olarak etkindir seçenekle
-fipa-pure-const
gerektirir
-O
ve daha yüksek
- 1. C# de const-doğruluk nasıl elde edilir?
- 2. Cython doğruluk
- 3. Doğruluk/JVM
- 4. Kesin Subimplicits
- 5. Java planlanmış yürütücü doğruluk
- 6. Android IMU doğruluk
- 7. Doğruluk Puanı: ValueError: İkili ve sürekli
- 8. /fp arasındaki fark: Kesin ve/fp: Kesin mi?
- 9. Sed maçı kesin
- 10. Anahtar deyiminde Doğruluk değerlerini değerlendirmek
- 11. kayan nokta sayılarını artırma doğruluk
- 12. Kesin frekanslar nasıl yanıp söndürülür?
- 13. Lookahead kümesinin kesin tanımı nedir?
- 14. R: tüm uyarıları temizleme
- 15. Homebrew doktor uyarıları
- 16. PHPDokümantasyon tarihi sorunu uyarıları
- 17. r: uyarıları gösterme
- 18. bütün uyarıları göster IntelliJ
- 19. Poltergeist kapatarak JQMIGRATE uyarıları
- 20. RSpec kullanarak uyarıları sınama
- 21. Suricata koşullu uyarıları
- 22. mongodb başlangıç uyarıları güncelleme
- 23. Fonksiyon - derleyici uyarıları
- 24. C# 6.0 # pragma uyarıları devre dışı bırakma özelliği nedir?
- 25. jenkins boru hattı uyarıları grafiği
- 26. Kendo Zamanlayıcı: Yeniden Doğruluk Düzenleyicisi'ni Özelleştir
- 27. R: tahmini verileri kullan: doğruluk() kesikli verilerde
- 28. Hint İngilizcesi için pocketsphinx için düşük doğruluk
- 29. HTML5 konumlandırmada tam olarak "doğruluk" ne demektir?
- 30. Uyarıları Hata Olarak İşleme Etme
"const doğruluğu" değil gerçekten yöntem argümanları veya yerel değişkenler ile ilgili çok şey var. cppcheck, aynı zamanda iyi oluşturulabilen sınıf yöntemlerinde stil uyarıları yayabilir. –
'-Wsuggest özniteliği ', const doğruluğu hakkında değil, GCC'ye özgü işlev öznitelikleriyle ilgilidir. __attribute __ ((const)) 'biraz“ constexpr ”e benzer. – Philipp