5

PC-Lint がエラー 503: リレーショナルのブール引数を表示するコードがあります。次のように定義されたテンプレート関数の呼び出しです。

template <typename ITypeToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    ITypeToUse *pControl);

呼び出し自体は次のようになります。

ShowWindowEx<IActualType>(this->GetWndHandle(), SW_SHOW, m_spControl);

どうやら、この部分ShowWindowEx<IActualType>(...)は次のように解釈されているようです... PC-Lintは、それが山括弧内の型を必要とするテンプレート関数であるIdentifier1 < Identifier2 > Expressionことに気付いていないようで、ブール式として解釈するために最善を尽くします。ShowWindowEx

この行のこのエラーを無視するように lint に指示するだけでよいことは承知していますが (実際には約 30 行あります)、これが再び発生するのを防ぎたいと思います。また、私が知る限り、PC-Lint はテンプレート関数呼び出しを処理できるはずですが、なぜこれがここに当てはまらないのでしょうか?

宣言はヘッダー内のクラス内にあり、呼び出しはそのクラスの別のメンバー関数内にあります。これは ShowWindowEx の直前に宣言されています。両方のメンバー関数の実装は .cpp ファイルで同じ順序で行われるため、ShowWindowEx の呼び出しはその実装の前に行われます。PC-Lint がヘッダーを無視した可能性はありますか?

編集:関数プロトタイプを次のように変更しました。

template <typename IPointerToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    IPointerToUse pControl);

したがって、テンプレートは型がポインターであることを処理します。提案してくれた DeadMG に感謝します。上記がうまくいかない理由はないので、疑問はまだ残っていますが、この方法でもうまくいきます。

4

2 に答える 2

1

503 は通常、C++ ではなく C の警告です。テンプレート関数呼び出しを含む C++ ファイルが、Windows マシンで *.C (大文字) を使用することにより、Lint によって C ファイルと見なされる可能性がありますか? または非標準の拡張子を使用していますか?

これは、Samba を使用して Windows PC の Lint インストールで Unix C++ プログラムを Lint するときに発生するのを見てきました。それでも問題が解決しない場合は、 のようなモジュール名を示す出力行を--- Module: ...確認し、括弧内のファイル タイプを確認してください。オフになっている場合は、-vm(デフォルト) を使用する必要がある場合があります。

この場合、呼び出しに関してさらに多くの警告が表示されることが予想されますが、テンプレート<...>を 2 つの比較演算子として解釈すると、正当にこの警告が表示されます。

それ以外に、あなたが提示した行は、コンテキストなしで、503 がここで適用できる理由を示していません。

于 2012-11-29T10:14:24.287 に答える
0

おそらくその理由は、Windows ヘッダーに ShowWindowEx の定義 (テンプレート定義ではないもの) が既に存在するためです。おそらく、関数の名前を変更してみてください。

于 2011-10-04T06:23:02.127 に答える