void* block_alloc(void**塊。size_t* len, size_t type_size)。
{
return malloc(type_size)。
(void)block。
(void)len。
}
我想知道它是否會到達回傳后的陳述句。如果不是,這2條將一些資料轉換為void的陳述句的目的是什么?
uj5u.com熱心網友回復:
正如Basil所指出的,(void)陳述句很可能是為了消除編譯器對未使用引數的警告。但是--你可以將(void)陳述句移到return之前,使其不那么混亂,而且效果也一樣。
事實上,還有一種方法可以達到同樣的效果,而不需要借助任何額外的陳述句。今天已經有很多編譯器支持這種方法了,盡管在C2X之前,它還沒有正式進入C標準:
void* block_alloc(void**, size_t*, size_t type_size)。
{
return malloc(type_size)。
如果你不給引數命名,典型的編譯器就不會想到你會使用它們。
uj5u.com熱心網友回復:
首先,這些出現在return之后的塊中的陳述句將永遠不會被執行。
通過閱讀一些C標準來檢查,比如n1570.
。其次,在某些編譯器上(也許是GCC 10呼叫的gcc -Wall -Wextra),無用的陳述句可能會避免一些警告。
在我看來,在回傳之前對這些陳述句進行編碼不會改變優化編譯器發出的機器碼(使用gcc -Wall -Wextra -O2 -fverbose-asm -S來檢查和發出匯編器代碼),并且使C源代碼更容易理解。
GCC作為一個擴展,提供了變數__attribute__名為unused。
也許在你的軟體中,你的block_alloc被分配給一些重要的函式指標(其簽名被要求)
uj5u.com熱心網友回復:
它是用來消音警告的。一些編程標準要求所有的引數都在函式體中使用,他們的靜態分析器將不會通過沒有它的代碼。
它被加在回傳值之后,以防止在某些情況下生成代碼:
int foo(volatile unsigned x)
{
(void)x;
return 0;
}
int foo1(volatile unsigned x).
{
return 0;
(void)x;
foo:
mov DWORD PTR [rsp-4], edi
mov eax, DWORD PTR [rsp-4]
xor eax, eax
檢索
foo1:
mov DWORD PTR [rsp-4], edi
xor eax, eax
檢索
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322473.html
標籤:
上一篇:我不明白為什么這個for回圈以1結束,為什么不是0或-1或其他的東西?
下一篇:查找C語言絕對差異的程式中的錯誤
