請問這個函數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]] 主動標明,見:

C++ attribute: nodiscard (since C++17)?

en.cppreference.com

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 內核模塊

TAG:編程 | Linux | C編程語言 | CC |