14 Mart 2017 Salı

assert

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__)

Hiç yorum yok:

Yorum Gönder