私は最近、"void" を返す関数の呼び出しに (void) というプレフィックスを付ける、かなり変わったコーディング規則に出くわしました。
例えば
(void) MyFunction();
次のような関数呼び出しとは異なりますか。
MyFunction();
それは何か利点がありますか、それとも不必要ですが、何らかのコーディング規約がありますか?
私は最近、"void" を返す関数の呼び出しに (void) というプレフィックスを付ける、かなり変わったコーディング規則に出くわしました。
例えば
(void) MyFunction();
次のような関数呼び出しとは異なりますか。
MyFunction();
それは何か利点がありますか、それとも不必要ですが、何らかのコーディング規約がありますか?
printf()のようないくつかの関数は、実際のコードではほとんど使用されない値を返します(printfの場合、印刷される文字数)。ただし、 lintなどの一部のツールは、関数が値を返す場合はそれを使用する必要があることを想定しており、次のようなものを記述しない限り文句を言います。
int n = printf( "hello" );
ボイドキャストの使用:
(void) printf( "hello" );
は、そのようなツールに、本当に戻り値を使用したくないことを伝える方法であり、したがって、ツールを静かに保ちます。このようなツールを使用しない場合は、わざわざする必要はありません。いずれの場合も、ほとんどのツールでは、特定の関数からの戻り値を無視するようにツールを構成できます。
いいえ、違いはありません。void にキャストされるのは、関数の戻り値です。
戻り値を使用していないことを明示したいのは理にかなっていると思いますが(副作用のために呼び出しています)、関数にはすでに無効な戻り値があるため、あまり意味がありません.
関数が何かを返す場合、一部のコンパイラ(またはlintツール)でvoidが回避できる(!)警告(実際には、戻り値が失われたことをgccに警告させることはできませんでした)。しかし、もっと重要なことは、戻り値が意図的に(誤ってではなく)「捨てられる」ことを明確にすることです。
HPUX のマニュアル ページでは、例のコードで lint 警告を回避するために void へのキャストが行われていることがよくあります。
fprintf(mystream, "%s\n", "foo");
対。
(void)fprintf(mystream, "%s\n", "foo");
それがコードの作者の出身地かもしれません。IMO、たとえば、sprintf ファミリーのほとんどは malloc を呼び出すため、これは良い考えではありません。十分なメモリがない場合、malloc は失敗します。また、SIGINT は、printf() ファミリー メンバーの場合、基になる write() システムコールを中断させ、すべてのバッファーを書き込まないようにします。
それは何か利点がありますか、それとも不必要ですが、何らかのコーディング規約がありますか?
変わりはない。たとえば、ソフトウェアのテストでは、コンテキスト内で関数の戻り値があれば、破棄しても安全であるという事実を強調することは、非常に一般的な規則です。
学問的に:「関数」は常に何かを返します。それ以外の場合はプロシージャになります。したがって、このコードの作成者は、「この命名が間違っていることはわかっていますが、名前を変更しないので、この障害を可視化します」と言いたいのです。