2012-04-14 21 views
20

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++

+0

"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. –

+0

'-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

cevap

6

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.

+2

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

+0

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

+0

[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

0

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.

5

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

.

0

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

0
-Wsuggest-attribute=const 

Bu analiz de varsayılan olarak etkindir seçenekle

-fipa-pure-const 

gerektirir

-O 

ve daha yüksek