Derleyici uyarılarını ne yapmak lazım?

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,845
Genel olarak, derleyiciyi ne kadar fazla uyarı üretecek şekilde ayarlarsak, o kadar iyi. Maksimum uyarı seviyesi ile, hiç uyarı üretmeyen kod yazabiliyorsanız, o kodda umulmadık bug'ların veya güvenlik açıklarının olma riskini azaltmış olursunuz.

Ama bazan bu gerçekçi olmuyor. Kodun okunabilirliği açısından veya performans açısından bazan derleyicinin beğenmeyeceği bir kod yazmanız gerekebiliyor.

Mesela switch/case yapılarında derleyici, her case'den sonra mutlaka break ister. Ama ben bazan bir case'de yapılan işlerin yapılmasını isterim, sonra da bir sonraki case'in içine düşüp oradan devam etmek isterim. Burada derleyici hemen uyarısını üretecek. Böyle durumlarda ne yapmak lazım?

C:
switch (a)
{
    case 0:
        b = 8;
        break;

    case 1:
        b = 17;
        /* asagidaki case ile devam */

    case 2:
        b = b + 3;
        break;
}

Derleyiciye desek "bir case'den sonraki case'e düşme için uyarı üretmeyi kes" nasıl olur? Evet bunu yaparsak derleyici uyarı üretmeyecek, ama bu genel bir ayar olacak ve başka yerde sen yanlışlıkla break koymayı unutmuşsan orada da uyarı üretmeyecek.

İşte böyle durumlar için, GNU GCC derleyicisinin sağladığı çok güzel bir olanak var. Kodda sadece belli bir bölgede bir uyarıyı devreden çıkarmak ve onun dışındaki yerlerde uyarının devre kalmasını sağlamak. Yukarıdaki örnek için uygulamayı yapalım.

Ilk pragma, mevcut uyarı üretme ayarını bir kenara yazıyor. Sonraki pragma, uyarıyı susturuyor. Bizim switch ile işimiz bittikten sonraki pragma da uyarı ayarlarını eski haline getiriyor.

C:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
"
switch (a)
{
    case 0:
        b = 8;
        break;

    case 1:
        b = 17;
        /* asagidaki case ile devam */

    case 2:
        b = b + 3;
        break;
}

#pragma GCC diagnostic pop
 
bende kendime uyarı notu olarak warning kullanmaya başladım. unutma şansı bırakmıyor...

#warning buraya sonra şunu yap...
 
#warning buraya sonra şunu yap...

Ama orada dikkat etmen lazım. Kendine fazla warning notu bırakırsan, derleme sırasındaki hızlı ekran akışında gerçek uyarıları kaçırabilirsin. Bir de senin notlar yüzünden program derlemesi bittiğinde hiçbir zaman "0 errors, 0 warnings" görmeyeceksin. warning sayısı sürekli değişecek ve bu durumda eğer yüzlerce source dosyasından oluşan bir proje varsa, kodda gerçek warning var mı yok mu anlamayacaksın.

Onun yerine eğer eclipse türevi bir IDE kullanıyorsan, TODO içeren bir comment ekle. Eclipse bunları otomatik olarak buluyor ve bir pencerede gösteriyor.

1713291334265.png
 

Forum istatistikleri

Konular
5,865
Mesajlar
100,043
Üyeler
2,485
Son üye
viesva

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top