94277


Visual Studio 2022において、クラスのメンバ関数として、例えば次のように複数の仮引数をもつ仮想関数を実装しようとしているのですが、

[code]

    virtual double func(bool a, int b, double c){}
    
[/code]

現在は「引数が関数の本体部で一度も参照されない」というvisual
studioのC4100警告の回避のためだけの処理を、基底クラスの関数定義に次のように書き、

[code]

    virtual double func(bool a, int b, double c)
    {
         if (a == TRUE)
        {
             // * 0.0によって0.0が返るようにするなど、なにかしら意味のない処理にする
    　　　　　return static_cast<double>(b) * c * 0.0;
        }
    　　
    　　return 0.0;
    }
    
[/code]

継承クラスの仮想関数オーバーライドで本来欲しい処理を書いています。

この仮想関数を必要とした条件は以下の通りです。

  * 基底クラスポインタに、複数ある別種類の派生クラスポインタのどれかを代入してコンテナに入れ、この仮想関数によってそれぞれのポインタでの挙動を変えたいので、基底クラスにこの仮想関数を実装する必要がある。
  * 複数ある別種類の派生クラスでは、必ずしも仮想関数をオーバーライドするとは限らず、基底クラスの別のメンバ変数のフラグによってこの仮想関数を実行するかどうか分岐する構造にしている。
  * コンテナ内のすべてのポインタに対して行いたい処理が他にもあるので、この仮想関数を実行するポインタかどうかでコンテナを分けず、フラグで分岐する構造にした。

基底クラスで純粋仮想関数にすると、派生クラスでまた同じC4100警告が出る可能性があることと、この仮想関数をオーバーライドしない派生クラスでこの仮想関数を意識したくないと思ったため、警告回避のため基底クラスに本来欲しい処理とは違う処理を書きましたが、このC4100警告を回避する他の方法があれば教えてほしいです。

よろしくお願いします。


CC BY-SA 4.0
2023-03-22T20:02:06.480
94276
2023-05-07T03:24:45.707
2023-03-23T01:21:04.310
3060
57637
question
c++ visual-studio
C++ Visual Studio で C4100 警告を回避したい


C++17以降であれば
[`[[maybe_unused]]`属性](https://cpprefjp.github.io/lang/cpp17/maybe_unused.html)
が使えます。こちらはC++標準ですので他のコンパイラーでも同様に警告が抑止されることが期待できます。

[code]

    double func([[maybe_unused]] bool a, [[maybe_unused]] int b, [[maybe_unused]] double c) {}
    
[/code]

従来の方法としてはVisual C++では `UNREFERENCED_PARAMETER()` マクロが用意されていました。

[code]

    double func(bool a, int b, double c) {
        UNREFERENCED_PARAMETER(a);
        UNREFERENCED_PARAMETER(b);
        UNREFERENCED_PARAMETER(c);
    }
    
[/code]

[`warning`プラグマ](https://learn.microsoft.com/ja-
jp/cpp/preprocessor/warning?view=msvc-170)を使用することで直接的に警告を抑止することもできます。  
なお、[プラグマには３種類の記法](https://learn.microsoft.com/ja-jp/cpp/preprocessor/pragma-
directives-and-the-pragma-
keyword?view=msvc-170)があります。一般的にはプリプロセッサディレクティブ`#pragma`を使う方法が有名です。

[code]

    #pragma warning(suppress: 4100)
    double func(bool a, int b, double c) {}
    
[/code]

実は他の記法を使うと（プリプロセッサディレクティブではないので）マクロ展開などの際にも追従してプラグマを指定できるので便利です。

[code]

    _Pragma("warning(suppress: 4100)")
    double func(bool a, int b, double c) {}
    __pragma(warning(suppress: 4100))
    double func(bool a, int b, double c) {}
    
[/code]

* * *

>
> 基底クラスで純粋仮想関数にすると、派生クラスでまた同じC4100警告が出る可能性があることと、この仮想関数をオーバーライドしない派生クラスでこの仮想関数を意識したくないと思ったため

なお、個々の関数で判断されているので、仮想関数かどうか、オーバーライドしているかどうかは関係なさそうでした。ですので、個々の派生関数でも同様に抑止する必要がありますし、基底クラスで定義する必要がなければ、純粋仮想関数にするべきです。


CC BY-SA 4.0
2023-03-22T21:08:42.790
94277
2023-05-07T03:24:45.707
2023-05-07T03:24:45.707
4236
4236
94276
answer


一応、仮引数の変数名を消すという方法もあります。

[code]

    virtual double func(bool, int, double) {}
    
[/code]


CC BY-SA 4.0
2023-03-22T21:15:03.323
94278
2023-03-22T21:25:25.250
2023-03-22T21:25:25.250
43506
43506
94276
answer