assert
- C kursu
- Orta seviye
- Ders 56/116
- 5 dk
assert ile debug denetimleri öğrenirsin.
assert makrosu
assert makrosu bir koşulu denetler; yanlışsa programı durdurur ve hata mesajı yazdırır. Kullanımı: assert(ptr != NULL);. <assert.h> başlığı gerekir. Koşul yanlışsa kaynak dosya adı ve satır numarasıyla birlikte abort çağrılır.
assert hata ayıklama aracıdır; beklenmeyen durumları yakalamak için kullanılır. NDEBUG makrosu tanımlıysa assert hiçbir şey yapmaz; bu yüzden üretim derlemelerinde kapatılabilir. Hata kontrolü için değil, programcı hatası (önkoşul ihlali) içindir.
assert ve fonksiyon çağrısı
assert'in içine yan etkisi olan bir fonksiyon koyma. Örnek: assert(allocate() != NULL); — NDEBUG ile derleyince allocate hiç çağrılmaz, davranış değişir. Doğrusu: önce çağır, sonra denetle.
assert mesajı dosya adı, satır ve koşulu içerir; bu yüzden ek mesaj yazmana gerek yoktur. C99 ve sonrasında static_assert derleme zamanı denetimi yapar ve _Static_assert ile de kullanılır. Çalışma zamanı assert için yine assert kullanılır.
Uygulama assert ile önkoşul ekle
<stdio.h> ve <assert.h> başlıklarını ekle. int divide(int a, int b) fonksiyonu yaz; içinde assert(b != 0); çağır ve return a / b; döndür. main içinde printf("%d\n", divide(10, 2)); yazdır.
Başlangıç kodu
#include <stdio.h>
// assert.h başlığını ekle
// divide fonksiyonunu yaz: önkoşul ve bölme
int main(void) {
// divide(10, 2) çağır ve yazdır
return 0;
}Örnek çözüm
#include <stdio.h>
#include <assert.h>
int divide(int a, int b) {
assert(b != 0);
return a / b;
}
int main(void) {
printf("%d\n", divide(10, 2));
return 0;
}Beklenen çıktı
5
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 assert hangi makro tanımlıysa devre dışı kalır?
- DEBUG
- NDEBUG Doğru cevap
- RELEASE
- ASSERT
Açıklama: NDEBUG tanımlıysa assert hiçbir şey yapmaz.
2 assert çağrısını tamamla
#include <assert.h>
void set_age(int age) {
____(age >= 0);
}
#include <assert.h>
void set_age(int age) {
assert(age >= 0);
}
Açıklama: assert(age >= 0) negatif yaşı yakalar.
3 assert kullanım biçimlerini eşle
| Kavram | Anlamı |
|---|---|
assert(ptr != NULL) |
Önkoşul denetimi |
NDEBUG |
assert'i kapatır |
abort |
assert çağırır |
assert.h |
Gerekli başlık |