[英]Why cast an unused function parameter value to void?
在一些 C 項目中,我見過這樣的代碼:
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
(void)osize;
/* some code not using `ud` or `osize` */
return ptr;
}
兩個強制轉換為 void 有什么用途嗎?
這是為了避免編譯器發出警告,因為某些參數未使用。
在原型中使用未使用的參數的原因通常是因為該函數需要符合某些外部 API - 也許它是一個庫函數,或者指向該函數的指針被傳遞給另一個需要此調用約定的函數。 然而,並非調用約定使用的所有參數都在函數本身中實際需要。
在正文中提到參數名稱的原因是為了避免出現類似的警告
unused.c: In function ‘l_alloc’:
unused.c:3:22: warning: unused parameter ‘ud’ [-Wunused-parameter]
void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
^~
可以通過在函數體中使用實際參數來抑制此警告。 例如,如果您確實有以下語句:
ud;
此警告現已取消。 但是現在 GCC 會產生另一個警告:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
這個警告告訴聲明ud;
,雖然在語法上是有效的 C,但根本不影響任何事情,並且可能是一個錯誤,與語句不同
abort;
也許應該寫成abort();
而是讓它做點什么。
這就是(void)
強制轉換的用武之地 - 它會明確且明確地告訴編譯器該語句應該完全沒有任何效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.