CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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

Soru
#include <assert.h>
void set_age(int age) {
    ____(age >= 0);
}
Cevap
#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

Orta seviye bölümündeki tüm dersler