Nasıl Kullanırız
assert macrosunu kullanmak için C programlarında şu satır dahil
edilir.
#include <assert.h>
C++ programlarında ise şu satırı dahil edilir.
#include <cassert>
Macro'nun İçin Nasıldır
assert sadece debug derlenmiş kodlarda çalışır. İçi
şöyledir.
#ifdef NDEBUG
#define assert(x) ((void)0)
#else
#define assert(x) ((x) ? (void)0 : abort())
#endif
Debug kodlarda NDEBUG tanımlı değildir.. Dolayısıyla assert etkindir. Release kodlarda ise NDEBUG tanımlı olduğu için assert boşa çıkar yani çalışmaz.
gcc'de Release Moda Geçmek İçin
gcc ile release kodu derlemek için şöyle yapmak
gerekir.
gcc blablabla -DNDEBUG blablabla
Kod İçinden Release Moda Geçmek İçin
Şöyle
yaparız.
#define NDEBUG#include<assert.h>
int main(){
int x = 0;
assert (x!=0);
}
Derleyicinin seçeneklerinde -DNDEBUG tanımlı olmasa bile artık tanımlıdır. Açıklaması
şöyle
The assert macro is redefined according to the current state of NDEBUG each time that is included.
Kendi Assert Macromuz
Dosya ve Satır ile exception fırlatmak için şöyle
yaparız.
void ASSERT(const bool cond, const std::string& text, const std::string& file,
const int line)
{
if (!cond)
{
throw std::runtime_error(text + ". In file: " + file +
" on line: " + std::to_string(line));
}
}
#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)
İstersek aynı assert gibi davranıp std::abort() çağrısı da yapılabilir. Bu durumda daha gelişmiş bir assert elde ederiz. Şöyle
yaparız.
void ASSERT(const bool cond, const std::string& text, const std::string& file,
const int line)
{
if (!cond)
{
std::cout << text << ". In file: " << file <<
" on line: " << line << std::endl;
std::abort();
}
}
#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)