Giriş
Geliştiriciler, genellikle hata ayıklama amacıyla güvenilir bir günlüğe kaydetme mekanizmasına ihtiyaç duyarlar. Bununla birlikte, üretim sırasında verimli kodu korumak zorlayıcı olabilir, özellikle de ayrıntılı günlüğe kaydetme performansı etkileyebileceğinden. Sıkça karşılaşılan bir soru ortaya çıkar: printf()
‘e benzer değişken argüman listesi destekleyen yalnızca hata ayıklama fonksiyonu nasıl oluşturulur?
Bu blog yazısında, değişken girişlerin esnekliğini korurken, optimize edilmiş derlemelerde ortadan kaldırılabilen bir hata ayıklama günlükleme fonksiyonu oluşturmak için C/C++ ön işleyici direktiflerini kullanan basit bir çözüme göz atacağız.
Hata Ayıklama Günlükleme Fonksiyonu Oluşturma
Adım 1: Fonksiyon İmzasını Tanımlama
Günlükleme fonksiyonumuzun bir format dizesi ve değişken sayıda argümanı kabul etmesini istiyoruz. printf
tarzı fonksiyon imzası, dize biçimlendirmesini dinamik olarak yapmamıza olanak tanır. Aşağıda, istenen fonksiyonun temel bir iskelet yapısı bulunmaktadır:
void XTrace(LPCTSTR lpszFormat, ...);
Adım 2: Değişken Argümanları Kullanma
Değişken argüman işlevselliği elde etmek için, C standart kütüphanesi tarafından sağlanan va_list
, va_start
ve va_end
makrolarını kullanabiliriz. Bu, XTrace
‘e geçirilen argümanları işlememizi sağlar.
Bunu nasıl uygulayabileceğinize bir örnek:
#include <stdio.h>
void XTrace(LPCTSTR lpszFormat, ...) {
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512]; // Bunun yerine dinamik bellek tahsisi kullanmayı düşünün
nBuf = _vsnprintf(szBuffer, 511, lpszFormat, args);
::OutputDebugString(szBuffer);
va_end(args);
}
Kodun Ana Unsurları:
va_list args
: Argüman listesini depolamak için kullanılır.va_start(args, lpszFormat)
: Bu,lpszFormat
‘tan sonraki argümanları almak içinargs
‘i başlatır._vsnprintf
: Bu fonksiyon, argüman listesini kullanarak dizeyi biçimlendirir ve bir tamponun içine yazar.OutputDebugString
: Biçimlendirilmiş dizeyi hata ayıklayıcının çıktı penceresine çıkarır.
Adım 3: Koşullu Derleme
Hata ayıklama fonksiyonunun optimize edilmiş derlemelerde kaldırıldığından emin olmak için ön işleyici direktiflerini kullanabiliriz. Bir hata ayıklama bayrağına dayalı bir makro tanımlayarak, günlükleme fonksiyonumuzu dahil etme veya hariç tutma kontrolü sağlayabiliriz.
Örnek Kurulum:
#ifdef _DEBUG
#define XTRACE XTrace
#else
#define XTRACE
#endif
XTRACE
makrosu, hata ayıklama modunda derlenirken gerçekXTrace
fonksiyonuna işaret edecektir. Optimize edilmiş derlemelerde (eğer_DEBUG
tanımlı değilse),XTRACE
boş bir ifade haline gelerek herhangi bir hata ayıklama kodunu etkili bir şekilde ortadan kaldırır.
Hepsini Bir Araya Getirme
Aşağıda, açıklık için tam uygulama verilmiştir:
#include <stdio.h>
#include <stdarg.h>
#include <Windows.h> // veya platforma göre <Linux/string.h> kullanabilirsiniz
void XTrace0(LPCTSTR lpszText) {
::OutputDebugString(lpszText);
}
void XTrace(LPCTSTR lpszFormat, ...) {
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vsnprintf(szBuffer, 511, lpszFormat, args);
::OutputDebugString(szBuffer);
va_end(args);
}
#ifdef _DEBUG
#define XTRACE XTrace
#else
#define XTRACE
#endif
Artık kodunuzda XTRACE
makrosunu şu şekilde kullanabilirsiniz:
XTRACE("Uyarı: değer %d > 3!\n", value);
Sonuç
C/C++‘de değişken argümanları kabul eden yalnızca hata ayıklama amaçlı bir günlükleme fonksiyonu oluşturmak sadece mümkün değildir, aynı zamanda ön işleyici direktifleri kullanılarak etkili bir şekilde yönetilebilir. Bu teknik, üretim kodunuzu temiz ve performans açısından verimli tutar.
Artık üretim ortamında performanstan ödün vermeden uygulamalarınızı etkili bir şekilde hata ayıklayabilirsiniz!