2014-01-10 24 views
5

に私が使用しているライブラリのいくつかのコードを読んでいます、と私は、関数で、これが使用されたことがわかった。(void)someIntを使用する理由コード

void someFunction(Foo& a, int index, int partId) 
{ 
    (void) partId; 
    (void) index; 
    // more code 
} 

誰もがなぜ知っていますか?ありがとう。

+2

'partId'と' index'は使用されていませんでした。これは未使用のパラメータに関する警告をバイパスするためにそれらを評価する方法です。 –

+1

'(void)partId'ステートメントが避ける '未使用引数'の警告を避ける' void someFunction(Foo&a、int、int) 'を書く人はいません。 –

+0

@JonathanLeffler:開発者は、彼らが何をしているのか、将来のコード開発のためのプレースホルダーであることを知っているというより慈善的な説明です。 – Clifford

答えて

9

変数が関数本体で使用されていなかったことを示すコンパイラの警告/エラーを回避します。実際にそれらを使用せずに、使用partIdindex

void someFunction(Foo& a, int /*index*/, int /*partId*/) 
+0

それが私のやり方です。私はそれがよりクリーンだと思う。そうでない理由は何ですか? –

+0

文法 - (void)メソッドは命令を生成しないという事実に基づいていますが、実際には副作用があり実際に演算子を呼び出すようなオブジェクトを実際に作成することができます。私はそれを証明しようとしていません:) – kfsone

+3

@KitFisto:キャストを使ったバージョンはCで動作します。パラメータに名前を付けておくとC++でしか動作しません。 –

0

何それがないことである:それはスタイルの選択、変数の名前のないを残すことであろうと同じ効果を達成するための他の方法です。言い換えれば、コンパイラは、関数の引数が実際に使用されていると考え、実際にはコードを使用しないと考えます。

これはなぜですか?関数の引数がその本体で使用されていないときに警告を生成するために、コンパイラにフラグを設定しているためです。

C++では、単に関数から引数名を削除することができます。 Cでそれが見える場合は、引数名を省略できないので、未使用の関数引数について警告を無効にしてみてください。

+1

そして、なぜこのフラグを正しく設定していないのですか?関数void foo(int x、int y)を想像してみてください。あなたは疲れていて、体の中にyの代わりにxを書くと、yは未使用になります。警告はあなたに無料のデバッグを提供します。これは「悪いコンパイラフラグ」ではなく、「良いコンパイラフラグ」です。 – Pluc

+0

@ ThePluc、あなたが使用したくない 'void * extra'引数を取る関数に与えられたコールバックを想像してください。しかし、引数の名前を明確にすることは意味があります。確かに、私はパラメータ名を省略するとCにエラーが発生します。 – Shahbaz

+0

私はそれが好ましい解決策ではないと言いました。決してこれを使用しません。しかし、警告を無効にすることは確かに良いことではありません。私はpersonnalyのパラメータ名をコメントしたり、gcc(そしてCLang私は仮定します)の__attribute __(未使用)などのコンパイラ固有のオプションを使用します – Pluc

3

これは通常、関数でパラメータが使用されておらず、コンパイラが未使用のパラメータについての警告を発するときに行われます。ケースを追加することにより、コンパイラはそれらが使用されていると判断し、ウォーリングを発行しません。

あなたは同じことばかり関数からパラメータの名前を削除するマイ達成することができます:

void someFunction(Foo& a, int, int) 
{ 
} 
+0

私のexpirienceから関数の名前を削除すると、後で混乱が起こります。パラメータが失われ、最初に何が意味されているのかを理解するためには、もっと勉強しなければならないでしょう... – user1708860

+0

@ user1708860 - 私は同意します。これはクラス内のdeclerationがすべてのパラメータを持っているので、メソッドではそのような問題ではありませんが、必要でない場合は実装で省略できます。 – Sean

+0

名前のないパラメータを持つ通常の理由は、関数が3つのパラメータを必要とするインタフェースに準拠しているためですが、インタフェースのこの特定の実装では、2つのパラメータの情報は使用されません。コールバック、および関連する概念 –

1

IndexpartIdは、関数の内部で使用されていません。

通常、C/C++コンパイラは、未使用のパラメータについて警告を出します。

(void) parameter;ステートメントはコードを生成しませんが、上記の警告を回避するためにパラメータを使用していることをコンパイラーに知らせます。

何らかの理由でパラメータが使用されていないことを他のプログラマに簡単に知らせるためにも礼儀正しい方法です(通常は、より一般的なインターフェイスに従うか、同じインターフェイスの以前のバージョンから廃止されたパラメータをサポートします)。

Jerry Coffinが指摘したように、これはCとC++の両方で機能しますが、名前のないパラメータを使用する代替ソリューションはC++でのみ機能します。

関連する問題