0

重複の可能性:
未使用の戻り値を void
C++ にキャストする void にキャストする目的は何ですか?

CMakeを使用してGDCMコードをダウンロードしてビルドした後、私はこれに出くわしました:

void error_callback(const char *msg, void *) {
    (void)msg;
    gdcmErrorMacro( "Error in gdcmopenjpeg" << msg );
}

最初の行は何をしますか? そのようなものを見たことがない。重要な場合は、Visual Studio 2010 を使用してビルドするように CMake に指示したことを覚えておいてください。

4

3 に答える 3

9

未使用の変数の警告を防ぎます。おそらく、マクロは空のマクロとして d にするgdcmErrorMacro()ことができ、その場合は参照されません。#definemsg

于 2012-12-27T15:38:57.023 に答える
3

これにより、関数の仮パラメーターが関数で使用されていない場合にコンパイラの警告が出力されなくなります。

msg警告をエラーとして処理して製品コードをコンパイルすることは一般的に良い考えであるため、これはマクロの使用で以前に言及されたものをクリアする試みのように見えます。

msgこれは、最初に正式なパラメーターに名前を付けないことで対処できた可能性もあります。実際、マクロを使用するときに言及されていない場合は、IRL でそうします。

void error_callback(const char *, void *) {
}
于 2012-12-27T15:39:00.103 に答える
2

パラメーターmsgはその関数によって使用されず、コンパイラーは未使用のパラメーターについて文句 (警告) を出します。

行は単にその(void)msg;パラメータを「使用」します (影響はありません)。このようにして、コンパイラは警告を生成しません。

編集:実際には、関数はそのパラメーターを使用しますが、マクロgdcmErrorMacroは(コンパイル定義のマクロを介して)展開するように設定できます...何も展開しません(たとえば、do{}while(0);Linuxカーネルで慣例として、空の構造に。

このように、コンパイラーは、パラメーターを使用する関数の本体に何も表示されませんmsg(コンパイラーは前処理されたソース ファイルを参照するため、マクロは既に展開されていることに注意してください)。

その場合、前処理の後、コンパイラは次のように表示します。

void error_callback(const char *msg, void *) {
    (void)msg;
    do{ }while(0);
}

パラメータの唯一の「使用」はmsgその行(void)msg;です。

于 2012-12-27T15:39:36.870 に答える