assert¿Í ¸ÅÅ©·Î ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ µð¹ö±ë Á¤º¸ ¾ò±â
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

assert

assert´Â µð¹ö±ëÀ» À§Çؼ­ »ç¿ëÇÏ´Â ÇÔ¼ö·Î, Á¤ÇØÁø Á¶°ÇÀ» À§¹ÝÇÏ´ÂÁö¸¦ °Ë»çÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù. ¿¹ÄÁµ¥ °´Ã¼ÀÇ ÇÒ´ç ¿©ºÎ, ºÐ¸ð°¡ 0ÀÌ µÇ´Â °Í °°Àº À߸øµÈ °ª ÀԷµîÀÌ ±×°ÍÀÌ´Ù.
#include <assert.h> 
#include <iostream> 
 
using namespace std; 
 
int foo(int a, int b) 
{ 
    assert(b !=0 ); 
    cout << a << "/" << b << endl; 
    return a/b; 
} 
 
 
int main(int argc, char **argv) 
{ 
    cout << foo(100, 10) << endl; 
    cout << foo(100, 0) << endl; 
    return 0; 
} 
 

ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ º¸¿©ÁØ´Ù.
$ ./assert  
100/10 
10 
assert: assert.cc:8: int foo(int, int): Assertion `b !=0' failed. 
 

µµ´ÞÇØ¼­´Â ¾ÈµÇ´Â ¹®¸Æ¿¡ µµ´ÞÇßÀ½À» ¾Ë¸®±â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. HTTP ±â¹ÝÀÇ ÀÀ¿ë ÇÁ·Î±×·¥À» ¸¸µç´Ù°í °¡Á¤ÇØ º¸ÀÚ. ÀÌ ÇÁ·Î±×·¥Àº À¯Àú Method¿¡ µû¶ó if-else ºÐ±â¸¦ ÇÑ´Ù. ¸¸¾à HTTPÀÇ ÇÁ·ÎÅäÄÝÀ» ¿ÏÀüÇÏ°Ô ÀÌÇØÇϰí ÀÖ´Ù¸é ¹®Á¦µÉ°Ô ¾øÁö¸¸ ±×·¸Áö ¾ÊÀ» °æ¿ì¿¡´Â ¿¹»óÄ¡ ¸øÇÑ Method°¡ µé¾î ¿Ã ¼ö ÀÖÀ¸¹Ç·Î assert󸮸¦ ÇØÁÙ Çʿ䰡 ÀÖ´Ù.
if( method == HTTP_GET) 
    ... 
else if(method == HTTP_POST) 
    ... 
else if 
    ... 
else 
    assert(!"Unknown Method"); 
 

ÇÁ·Î±×·¥À» ¹èÆ÷ÇÒ ¶§´Â assert¸¦ Á¦°ÅÇØ¾ß ÇÑ´Ù. NDEBUG¸¦ Á¤ÀÇÇϸé ÄÄÆÄÀϽà assert¹®ÀÌ Á¦¿Ü½ÃŲ´Ù.
$ g++ -o assert assert.cc -DNDEBUG 
 

assert ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÑ µð¹ö±ë ·Î±× Ãâ·Â

assert°á°ú¸¦ º¸¸é ÆÄÀϸí, ÇÔ¼ö¸í, È£ÃâµÈ ÁÙ ¼ö¿Í °°Àº Á¤º¸¸¦ Ãâ·ÂÇÏ´Â °É º¼ ¼ö ÀÖ´Ù. C++ÀÇ °æ¿ì Ŭ·¡½º ¸í±îÁö Ãâ·ÂÇÑ´Ù. assert.h¸¦ ¿­¾îº¸¸é, À̵é Á¤º¸¸¦ ¾ò±â À§Çؼ­ ¸î°¡Áö ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ´Â °É È®ÀÎÇÒ ¼ö ÀÖ´Ù.
  1. __func__ : ÇÔ¼ö¸íÀ» °¡Á®¿Â´Ù.  
  2. __FILE__ : ÆÄÀϸíÀ» ¾ò¾î¿Â´Ù.  
  3. __LINE__ : ÁÙ¼ö¸¦ °¡Á®¿Â´Ù. 
  4. __DATE__ : ÄÄÆÄÀÏ µÈ ³¯Â¥. 
  5. __TIME__ : ÄÄÆÄÀÏ µÈ ½Ã°£ 
  6. __FUNCTION__ : C++¿¡¼­ »ç¿ë __func__¿Í µ¿ÀÏÇÏ´Ù. 
  7. __PRETTY_FUNCTION__ : Ŭ·¡½º À̸§°ú ÇÔ¼ö¸í, ¸Å°³ º¯¼ö±îÁö ÇÔ²² º¸¿©ÁØ´Ù.  
 

__ func __´Â ÇÔ¼öÀ̸§¸¸À» °¡Á®¿Â´Ù. C++¿¡¼­ Ŭ·¡½º¿Í ÇÔ²² »ç¿ëÇÒ °æ¿ì ¸Þ¼­µå À̸§¸¸ °¡Á®¿Ã »Ó, Ŭ·¡½º À̸§À» °¡Á®¿Ã ¼ö ¾ø´Ù. Ŭ·¡½º À̸§±îÁö °¡Á®¿À±â À§Çؼ­ __ PRETTY_FUNCTION __À» »ç¿ëÇÒ ¼ö Àִµ¥ g++ È®ÀåÀ¸·Î Ç¥ÁØÀÌ ¾Æ´Ï´Ù. ÄÄÆÄÀÏ·¯ ȣȯ¼ºÀ» °í·ÁÇÑ´Ù¸é ¾Æ·¡¿Í °°ÀÌ Æí¹ýÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.
class DB 
{ 
private: 
    const char *mclassName; 
public: 
    DB() { mclassName = __func__; } 
} 
 

À̺¥Æ® ·Î±ëÀ» À§ÇÑ °£´ÜÇÑ ¿¹Á¦
#include <iostream> 
#include <typeinfo> 
#include <assert.h> 
 
using namespace std; 
 
#define DB_OPEN_ERROR 100  
 
class CLog 
{ 
private: 
    int merrnum; 
    const char *mfuncname; 
    int mlinenum; 
public: 
    CLog(int errnum, const char *func_name, int linenum) 
    { 
        merrnum = errnum; 
        mfuncname = func_name; 
        mlinenum = linenum; 
    } 
    ~CLog(){}; 
    void Logging() 
    { 
        cout << "Logging " << "[" << merrnum << "] " << mfuncname << " : " << mlinenum << endl; 
    } 
}; 
 
class DB  
{ 
private: 
    const char* class_name; 
public: 
    DB(int a) 
    { 
        class_name = __func__; 
    } 
    int set(int a) 
    { 
        if(a < 0) throw CLog(100, __PRETTY_FUNCTION__, __LINE__); 
        cout << "set " << a << endl; 
        return 1; 
    } 
}; 
 
int main() 
{ 
    DB *myDB; 
    myDB = new DB(1); 
 
    try 
    { 
        myDB->set(-100); 
    } 
    catch (CLog &e) 
    { 
        e.Logging(); 
    } 
    return 0; 
} 
 

assert¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖÀ»±î ?

assert¸¦ »ç¿ëÇÑ´Ù´Â °ÍÀº ÃÖ¼ÒÇÑ ±× ÀÚ¸®¿¡ ¿¹¿Ü »óȲÀÌ ¹ß»ýÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀÎÁöÇÏ´Â »óȲÀÓÀ» ÀǹÌÇÑ´Ù. ±×·¸´Ù¸é ±ò²ûÇÏ°Ô ¿¡·¯Ã³¸®¸¦ ÇÏ´Â°Ô ³´Áö ¾ÊÀ»±î ? ±×°Ô ºñ·Ï ÇÁ·Î±×·¥ °³¹ß ÁßÀ̶ó°í ÇÏ´õ¶óµµ ¸»ÀÌ´Ù. ¹°·Ð ƯÁ¤ÇÑ ¿µ¿ª¿¡ ¿¹¿Ü »óȲÀÌ ¹ß»ýÇÒ °Å¶ó´Â °É ¿¹ÃøÀº Çϰí ÀÖÁö¸¸, ¿¡·¯ ó¸® Äڵ带 ÀÛ¼ºÇÒ¸¸ÇÑ Á¤º¸¸¦ ¾òÁö ¸øÇßÀ» ¶§´Â assert¸¦ »ç¿ëÀÌ ÇÊ¿äÇÒ ¼öµµ ÀÖ´Ù. À§¿¡¼­ ¾ð±ÞÇÑ HTTP ±â¹Ý ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ßÀÌ ±×·± ¿¹ÀÌ´Ù. if , else if ÈÄ ¸¶Áö¸· else¿¡ assert¸¦ ¹èÄ¡ÇØ¼­ ¿¹¿Ü¸¦ ÃßÀûÇÒ ¼ö ÀÖ´Ù.

¶Ç´Â »óȲ ¿¹ÃøÀÌ ¾î·Á¿î °æ¿ìµµ ÀÖÀ» ¼ö ÀÖ´Ù. ¿¹ÄÁµ¥ ÀÚ¿øÇØÁ¦ÀÇ °æ¿ìÀε¥, ÀÚ¿øÀÌ ¿©±âÀú±â ÇÔ¼ö¿Í Ŭ·¡½º¸¦ ³Ñ³ªµé´Ù º¸¸é ÇØÁ¦ÇÏ´Â ÀÚ¿øÀÌ À¯È¿ÇÑ ÀÚ¿øÀÌÁö ¾Ö¸Å¸ðÈ£ÇÒ ¶§°¡ ÀÖ´Ù. À̰æ¿ì assert¸¦ ÀÌ¿ëÇØ¼­ ÀÚ¿øÀ» µÎ¹ø ÇØÁ¦ Çϴ¹® µîÀÇ ¹®Á¦¸¦ ÃßÀûÇÒ ¼ö ÀÖ´Ù.

ÃßÀûÇÒ ¼ö¸¸ ÀÖ´Ù¸é, ¹®Á¦´Â ÇØ°áµÈ°Å¸¶ ¸¶Âù°¡Áö¶ó°í º¼ ¼ö ÀÖÀ¸´Ï, assert´Â ±× ¿ªÇÒÀ» ÈǸ¢È÷ ÇØ³Â´Ù°í º¼ ¼ö ÀÖ´Ù.


EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.