簡體   English   中英

“ static_cast”有什么用 <void> 在宏中?

[英]what is the use of “static_cast<void>” in macro?

我看到這樣的宏定義:

#define ASSERT_VALID_PARAM(param, assertion) {  static_cast<void>(param); if (!(assertion)) { throw InvalidParamError(#param, #assertion, __FILE__, __PRETTY_FUNCTION__, __LINE__); } }

我無法在這里找出對static_cast<void>(param) 對為什么需要這樣做有任何想法嗎?

此宏旨在通過某些驗證規則來驗證某個參。 宏的邏輯部分由2部分組成:

  1. 驗證param是帶有有效名稱的真實參數。 這可以通過使用static_cast ,如果使用了非法名稱,則會生成編譯時錯誤。
  2. 驗證assertion的“真實性”。 這是通過簡單的否定if語句完成的。

如果參數是有效名稱,並且斷言失敗( assertion == false ),則使用傳入的參數作為字符串(使用Stringizing運算符# )來初始化InvalidParamError ,以初始化錯誤對象。

由於宏中param參數的實際用法僅是字符串,因此必須使用實際代碼進行驗證。 由於不需要實際操作,因此使用static_cast,它會丟棄結果,並且有可能進行優化。 如果沒有該檢查,則可以傳遞任何值,該值將使斷言中的信息毫無意義。

這是“ C ++”的寫作方式

(void)param;

它使變量“使用”,從而禁用未使用變量的編譯器警告

static_cast<void>(param); 將評估param並丟棄結果。

如果您不將演員表添加到void

  1. 您可能會收到警告,表示您忽略了表達式的結果。
  2. 即使您傳遞一些非法代碼(例如,用語句代替表達式)作為參數,編譯器也會很樂意接受它。

來自cppreference

4)如果new_type是void類型(可能是cv限定),則static_cast在對表達式的值求值后將其丟棄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM