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

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,742
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?

Kod:
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.

Kod:
#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
7,287
Mesajlar
123,232
Üyeler
2,941
Son üye
skipper

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top