簡體   English   中英

需要為函數添加前綴(void)

[英]Need for prefixing a function with (void)

我最近遇到了一個相當不尋常的編碼約定,其中對返回“void”的函數的調用以(void)為前綴。

例如

(void) MyFunction();  

它與函數調用有什么不同:

MyFunction();  

它有沒有任何優勢,或者它是另一個不必要但有某種編碼約定?

某些函數(如printf())返回的值幾乎從未在實際代碼中使用(在printf的情況下,打印的字符數)。 但是,有些工具,比如lint ,期望如果函數返回一個必須使用的值,並且除非你寫下類似的內容,否則會抱怨:

int n = printf( "hello" );

使用void cast:

(void) printf( "hello" );

是一種告訴這些工具的方法,你真的不想使用返回值,從而保持它們的安靜。 如果您不使用此類工具,則無需費心,在任何情況下,大多數工具都允許您將它們配置為忽略特定函數的返回值。

不,沒有任何區別 - 什么被轉換為void是函數的返回值。

我會說你可以理解你想要明確表示你沒有使用返回值(你為副作用調用它),但由於函數已經有無效返回,它沒有多大意義。

如果函數返回某些東西,那么void可以避免(!)一些編譯器(或lint工具)上的警告(實際上我無法讓gcc警告我返回值丟失); 但更重要的是,它清楚地表明返回值是故意“拋棄”(而不是錯誤地)。

acedemically:“函數”總是返回一些東西,否則它將是一個過程。 所以這段代碼的作者想說“我知道這個命名是錯的,但我不會改名字,所以我讓這種干擾可見”

它有沒有任何優勢,或者它是另一個不必要但有某種編碼約定?

沒有不同。 這是一個非常常見的慣例,例如在軟件測試中強調在上下文中函數返回(如果有的話)可以安全丟棄的事實。

在HPUX手冊頁中,在示例代碼中很常見的是將轉換為void來解決lint警告。

fprintf(mystream, "%s\n", "foo");

(void)fprintf(mystream, "%s\n", "foo");

這可能是代碼作者的來源。 IMO,這不是一個好主意,因為大多數sprintf系列,例如,調用malloc。 當內存不足時,malloc將失敗。 對於printf()系列成員,SIGINT還會導致底層的write()系統調用中斷而不是寫入所有緩沖區。

暫無
暫無

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

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