2013-05-27 43 views
0

是否可以在assert錯誤時編寫消息?在消息中使用assert()

例如,使用#include <assert.h>,我只能寫:

void foo(int a, int b) { 
    assert (a != b); 
} 

然而,在一個錯誤我想看到的ab值。我怎樣才能做到這一點?

+0

if(!(a!= b))cout << whatever。 – mah

+0

http://stackoverflow.com/questions/5867834/assert-with-message – BoBTFish

+3

標題有點誤導。首先想到的是'assert(a!= b &&「錯誤信息」)解決方案,這不是你正在看的。 –

回答

6

assert只是一個預處理宏,如果條件失敗,調用abort。您可以輕鬆地製作自己用一個簡單的if聲明,如果失敗打印值,並調用abort就像assert

void foo(int a, int b) 
{ 
    if (a != b) 
    { 
     std::cerr << "My own assertion failed: a = " << a << ", b = " << b << '\n'; 
     abort(); 
    } 

    /* ... */ 
} 

然而,當您使用C++你應該拋出一個異常,而不是,大概std::logic_error

void foo(int a, int b) 
{ 
    if (a != b) 
    { 
     std::istringstream is; 
     is << "Argument mismatch in `foo`: a = " << a << ", b = " << b; 
     throw std::logic_error(is.str()); 
    } 

    /* ... */ 
} 
+2

爲斷言,我認爲#ifdef DEBUG也應該使用 – user1810087

+1

這是真的,但正確的宏是'NDEBUG',具有相反的含義。這就是說,建議用一個異常替換一個斷言是一個壞主意。一個是運行時錯誤,您可以處理和恢復。另一種是編程錯誤的內部狀態不一致,你應該轉儲核心和中止。 –

1

它可以編寫自己的斷言宏能打破一個表達式爲子表達式並打印出每個值;但它需要很多代碼才能支持它,而標準的assert宏在我所知的任何實現上都沒有這樣做。

有關如何實現此類事件的示例,請參閱CATCH test framework,特別是CHECK宏的實現。

或者,您可以編寫宏或函數,如ASSERT_EQUAL(a,b),將每個子表達式作爲單獨的參數。

或者你可能不assert

if (a == b) { 
    throw std::runtime_error("foo: a(" + std::to_string(a) + ") must not equal b"); 
} 
+0

Marco是可能的,但我不想使用它。 – mahmood

+1

@mahmood:你可以將它作爲一個函數來實現,但是你會失去'__FILE__'和'__LINE__'宏來告訴你代碼中斷言的位置,以及將表達式作爲字符串捕獲的能力。 –

2

編寫自己的錯誤處理代碼,我通常只使用assert(a != b && "This is my error message")。這是可行的,因爲char*可以轉換爲布爾值,它永遠不會是錯誤的(因爲地址不是0)。