web-dev-qa-db-ja.com

未使用の戻り値をvoidにキャストする理由

int fn();

void whatever()
{
    (void) fn();
}

未使用の戻り値をvoidにキャストする理由はありますか、それとも時間の無駄だと思いますか?

ファローアップ:

まあそれはかなり包括的なようです。自己文書化コードはコメントよりも優れているため、未使用の戻り値をコメント化するよりも優れていると思います。個人的には、これらの警告は不要なノイズなので、オフにします。

バグがそれのために逃げたら私は私の言葉を食べます...

104
markh44

Davidの answer は、この関数の戻り値を知っているが、それを明示的に無視している他の「開発者」を明示的に表示するための動機をほとんどカバーしています。

これは、必要なエラーコードが常に処理されるようにする方法です。

C++では、これがおそらくCスタイルのキャストを使用することを好む唯一の場所だと思います。なぜなら、完全な静的キャスト表記を使用することは、ここではやり過ぎのように感じるからです。最後に、コーディング標準をレビューする場合、またはコーディング標準を作成する場合は、(関数呼び出し表記法を使用しない)オーバーロードされた演算子への呼び出しもこれを免除することを明示することをお勧めします。

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.
72
Richard Corden

仕事でそれを使用して、関数に戻り値があるが、開発者はそれを無視しても安全であると断言しています。質問にC++のタグを付けたため、static_castを使用する必要があります。

static_cast<void>(fn());

コンパイラーが戻り値をvoidにキャストする限り、意味はほとんどありません。

43
David Holm

これを行う本当の理由は、Cコードで使用される lint と呼ばれるツールにまでさかのぼります。

コードを分析して、考えられる問題を探し、警告と提案を発行します。関数がチェックしなかった値を返した場合、lintはこれが偶発的である場合に警告します。この警告でlintを黙らせるには、(void)への呼び出しをキャストします。

35

voidへのキャストは、未使用の変数と未保存の戻り値または式に対するコンパイラの警告を抑制するために使用されます。

Standard(2003)は、§5.2.9/ 4で次のように述べています。

どの式も明示的に「cv void」型に変換できます。式の値は破棄です。

だからあなたは書くことができます:

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

すべてのフォームが有効です。私は通常、次のように短くします:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

それも大丈夫です。

22
Nawaz

あなたのプログラムにとって、voidへのキャストは意味がありません。また、Davidの回答で示唆されているように、コードを読んでいる人に何かを知らせるために使用しないでください。意図について何か伝えたい場合は、コメントを使用することをお勧めします。このようなキャストを追加すると、奇妙に見えるだけで、考えられる理由について疑問が生じます。ただ私の意見...

4

私はこれが古いスレッドであることを知っていますが、言語は進化しており、c ++ 17以降、voidキャストの代わりに使用できる_[[maybe_unused]]_属性があることを完全にするためにここで言及する必要があります。

4
florestan

Voidへのキャストにはコストがかかりません。コンパイラーがそれをどのように処理するかについての情報のみです。

3
klew

Cでは、voidにキャストしてもまったく問題ありません。事実上誰でも声明の意図を理解するでしょう。

C++では、他のツールを自由に使用できます。通常、Cキャストは眉をひそめます。また、明示的にvoidにキャストすると同僚を驚かせる可能性があるので(私の場合は驚かされます)、この関数テンプレートはどこかにあります。

template <typename T>
void use_expression(const T&) {}

そして私は使用します

...
use_expression(foo());

(void)foo() in C.

3
Alexandre C.

また、コードがMISTA(または他の)標準に準拠していることを検証する場合、LDRAなどの自動ツールでは、戻り値を明示的に(void)にキャストしない限り、値を返さずに戻り型を持つ関数を呼び出すことはできません

1
Versatile