問題:#define assert_param(expr) ((void)0) 這是個宏定義,但是我真是不知道(void)0能執行什麼操作
具體的定義和用法在下面
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset)
{
assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR=NVIC_VectTab|(Offset&(u32)0x1FFFFF80);
}
答案:這是斷言機制。意思是在關閉斷言的情況下,
如
#ifdef NDEBUG
#define assert(exp) ((void)0)
#else
#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
如果你寫的代碼中使用了斷言,比如:
assert(i>=0);
那麼這句的在程式中的作用分兩種情況:
1. 若果在assert.h被包含之前NDEBUG這個宏未定義,assert(exp) 就被定義為(void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )。這樣當i<0時,i>=0這個表達式為假,是以程式就會終止。并通知程式員發生錯誤的檔案位置和代碼行。但是錯誤資訊僅僅對程式員有用。對使用者來說,程式異常終止就顯得不是那麼友好了(使用者此時需要的是挽回錯誤)。是以在釋出給使用者的程式中,assert(斷言)要關閉。在VC++6.0下這是通過在包含assert.h頭檔案之前定義NDEBUG實作的。
2.在定義了NDEBUG的情況下,斷言不應該給程式帶來副作用。這樣斷言就被定義為:
#define assert(exp) ((void)0)
此時,assert(i>=0);不管括号中表達式為真還是為假,這一行代碼其實相當于:
NULL;意思是不執行任何操作
————————————————
版權聲明:本文為CSDN部落客「出世SI」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/qq_35370790/article/details/79686422