請問這個函數void這麼用是什麼意思?
為了避免編譯器警告。這個應該是 C 代碼吧,類似的,比如:
static void f(int x) {}
int main() {
f(1);
return 0;
}
然後加上 -Wunused-parameter
選項編譯:
$ gcc a.c -Wunused-parameter
a.c: In function 『f』:
a.c:1:19: warning: unused parameter 『x』 [-Wunused-parameter]
static void f(int x) {}
你如果在函數體內顯式地 (void)x
,就不會出現警告。
當然,你也可以不用 -Wunused-parameter
這個選項,但是這個選項絕大多數情況下是有用的,因為正常的函數,如果有函數參數沒用,那麼很大可能性是編寫出錯了。比如比較兩個輸入參數的大小,因為你複製粘貼了,實現的時候可能寫成了:
int f(int x, int y) {
// g(x) 只代表一個流程,可能並沒封裝成函數,即使封裝了函數,也可能被無腦複製粘貼有部分忘了改
int xx = g(x);
int yy = g(x);
return xx - yy;
}
這時候就會提示你 y
沒用到。當然,一般都用 -Wall
來執行所有(all)嚴格的檢查,它包括更多的檢查,參考:
Using the GNU Compiler Collection (GCC)?embarc.org
將某個變數轉換成 void
能夠使編譯器認為這個變數已經使用過了(雖然這種代碼毫無意義也不影響性能),從而不會彈出某些警告,這種用法在老一輩的 C 代碼中非常常見。在 C++ 中,不使用的參數,可以直接忽略名字,這樣就不會彈出警告,比如:
static void f(int) {}
int main() {
f(1);
return 0;
}
所以這種小技巧,在 C++ 中用處也不大。
此外還有一些編譯器警告,比如函數的返回值沒有使用(尤其是 printf
這種函數幾乎沒人使用其返回值),在 C++ 中可以用[[nodiscard]]
主動標明,見:
If a function declared nodiscard or a function returning an enumeration or class declared nodiscard by value is called from a discarded-value expression other than a cast to void, the compiler is encouraged to issue a warning.
雖然也有一些編譯器特有的語法實現同樣功能。
如果把這幾行任何一行刪掉,編譯時候開-Wall -Wextra 它就會給你warning告訴你某個參數在函數里沒有被使用,很多項目里為了保證代碼的可讀和安全,都會打開這兩個-W,甚至會打開-Werror,這時候warning會被報錯,就不能編譯了
但實際情況是,有時候確實會用不到一些參數,就用(void)xxx來假裝用過了它,防止編譯器報錯,同時也是提醒自己或是今後回來讀代碼的人,這個參數沒有被用到過
看函數的意思,這個函數就是忽略處理。
在程序里有很多鉤子函數,根據處理流程調用各種函數,現這種函數就是什麼也不做。
函數是空函數,加處理是為了避免編譯警告
大概是預留了以後擴展用。但是參數不用會被警告。
為了避免編譯警告
對於MSVC編譯器,你甚至可以使用#pragma warning(disable: 4101)將這個警告關掉
比較明顯的C代碼,為了去除編譯器警告的。
StackOverflow上的回答,指出了該做法可以在不同編譯器間移植:
You can /stackover&flow.com/questions/308277/what-is-the-consequences-of-ignoring-warning-unused-parameter/308286#308286">put it in "(void)var;" expression(does nothing) so that a compiler sees it is used. This is portable between compilers.
看編譯器嚴格程度,可能是這些傳參不使用會報 warning。
所以就假裝使用一下這些參數,沒有實際意義。
推薦閱讀:
※Linux 下強大得不得了的 IO 重定向
※Linux介紹
※RHEL 8 刪除了Btrfs文件
※Linux 許可權管理
※深入學習 Linux 內核模塊