Nasıl Kullanırız
assert macrosunu kullanmak için C programlarında şu satır dahil edilir.
assert sadece debug derlenmiş kodlarda çalışır. İçi şöyledir.
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.
Kendi Assert Macromuz
Dosya ve Satır ile exception fırlatmak için şöyle yaparı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ırassert 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ı şöyleThe 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__)
Hiç yorum yok:
Yorum Gönder