34

重複の可能性:
未使用の戻り値を void にキャストする

(void)たとえば、関数呼び出しの前の目的は何ですか

(void)func1();

これは単に呼び出すのと同じだと思いますfunc1();

したがって、この呼び出しは、たとえば戻り値の型が の(void)場合など、戻り値の型が無視されることを他のプログラマーに知らせるためのものですか、それともコンパイラーが関数に対して何らかの最適化を実行するのでしょうか? おそらく、その背後には完全に別の理由があります-合法的なC ++でさえあるのか、それともレガシーコードに見られるCの名残なのか.func1()int

ありがとう

4

4 に答える 4

25

一部の関数が次の属性で宣言されている場合の警告を防ぎます:「戻り値が使用されていない/チェックされていない場合に警告する」

警告の重複である可能性があります:属性warn_unused_resultで宣言された「scanf」の戻り値を無視します

詳細については、gccのドキュメントを確認してください: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html(warn_unused_result)

于 2012-12-19T14:30:39.360 に答える
23

void へのキャストは、1 つのケースでセマンティック効果を持つことができます: 値がコンマ演算子のオペランドであり、コンマ演算子をオーバーライドする場合、void へのキャストはそれを抑制します:

struct S {
  int operator,(int) { return 0; }
};
std::cout << (S(), 42) << '\n';           // prints '0'
std::cout << ((void) S(), 42) << '\n';    // prints '42'
于 2012-12-19T14:38:21.830 に答える
5

それはほとんど意味がありません。これは、行を明示的にvoid式に変換しています。これは、副作用にのみ使用され、値が破棄される式です。だから線

func1();

(void)func1();

同じことをします。式の値が使用されていないことをコンパイラーが認識している場合に実行できる最適化がある可能性がありますが、コンパイラーは明示的(void)の有無にかかわらずそれを理解できる可能性があります。

これは、プログラマーが式の値を使用していないことを明らかにしようとしているドキュメントの形式として使用できます。

于 2012-12-19T14:32:13.893 に答える
3

もう1つの奇妙な使用法は、未知の戻り型の関数を,シーケンス演算子として演算子に隣接して使用できるようにすることです。つまり、「と同じように操作できる、そしてこのタイプを返すタイプにしたいdecltype( f(), g() )」と言いたいテクニック。ただし、オーバーロードされるような型を返す場合、結果は予期しないものになります。f()gg()f()operator,

したがって、を実行し、を呼び出す前にdecltype( void(f()), g() )の戻り値を破棄します。これにより、不明なオーバーライドタイプの代わりに、組み込みのシーケンス演算子を取得することが保証されます。f()operator,

于 2012-12-19T14:45:06.003 に答える