天天看點

#define assert_param(expr) ((void)0) 這是個宏定義,(void)0執行的操作

問題:#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

繼續閱讀