18500

[code]

    環境: CやC++の開発環境
    
[/code]

コンパイル時の警告についての質問です。

以下のテスト用関数を用意したとします。ステップ実行でvalの値をチェックするためです。

[code]

    void Test_someFunc() {
        int val;
        val = getVal();
    }
    
[/code]

上記コードを含めたソースをコンパイルすると以下の警告が出ます (確認環境: C++ Buiilder XE4)。

> valに代入した値は使われていない

この警告自体は未使用の変数がわかって便利なのですが、上記のようなテスト関数でも警告が出てしまいます。

こういう場合、どのようにして警告を表示しないようにできるでしょうか（警告をOFFにしない方法で)。

よろしくお願いいたします。


CC BY-SA 3.0
2015-11-07T01:50:19.110
18499
2016-10-07T13:57:42.840
4840
question
c
警告「xxxに代入した値は使われていない」の対処方法


式の結果に対して(void)を指定するとコンパイラにこの式の結果は使わない(例えばprintfの結果のような返値が使用されない時など明示的に値を破棄する)ことをコンパイラに‌​伝えることができます。

参考：[6.8.3 Expression and null
statements](http://www.compsci.hunter.cuny.edu/~sweiss/resources/c11standard.pdf)


CC BY-SA 3.0
2015-11-07T02:31:14.307
18500
2015-11-07T02:39:49.247
2015-11-07T02:39:49.247
5044
5044
18499
answer


> ステップ実行でvalの値をチェックするためです。

一例に対しての反論では意味をなさないかもしれませんが、

[code]

    assert(val != 0);
    
[/code]

など確実に成立すべき条件を記載すれば、コンパイラーも警告しませんしテストにもなります。


CC BY-SA 3.0
2015-11-07T03:00:40.020
18502
2015-11-07T03:00:40.020
4236
18499
answer


以下のような、使用しない変数を引数にしたダミー関数を呼び出す方法はいかがでしょうか。

Cの場合:

[code]

    // 共通ヘッダあたりに定義
    static inline void unused_impl(int dummy, ...) {}
    #define UNUSED(...) unused_impl(0, __VA_ARGS__)
    (中略)
        // 関数内
        int val1 = f();
        int val2 = g();
        UNUSED(val1, val2)
    
[/code]

C++の場合:

[code]

    // 共通ヘッダあたりに定義
    template<typename... TS> void unused(const TS &...) {}
    (中略)
        // 関数内
        int val1 = f();
        int val2 = g();
        unused(val1, val2);
    
[/code]

長所:

  * マクロ/関数名を適切なものにすることで、「使用しない」という意思が伝わりやすくなる。
  * 複数の変数を同時に指定できる。

短所:

  * それぞれC99、C++11以降に対応している必要がある。(C++ Builder XE4 は対応してましたっけ？ 新しめのは対応しているようですが)
  * 最適化をかけないと、ダミー関数呼び出しのオーバーヘッドがかかる。


CC BY-SA 3.0
2015-11-08T09:35:31.267
18543
2015-11-08T09:35:31.267
7831
18499
answer