- 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?
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.
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