同じ変数を代入

始めまして。ぷにと申します。

アルファプロジェクトのRX62N基板

サンプルプログラムを見ていると

    ch = ch;    /* Keep compiler happy */

との記述がありました。

これはどういう意図で行うものでしょうか?

自己解決しました。すいません。

関数内で使わなくなったので

コンパイラの警告が出ないようにしてるだけでした。

サンプルなので消してくれればいいものを…

失礼しました。

Parents
  • NoMaYさんが書いている通り(void)をもうこの先使用しない自動変数の先頭や関数呼び出しの先頭につけるという文法、これは比較的古いCの規格(C99ならExpression and null statementsに記載されています)から存在します。変数なら参照範囲の終了を明示し、関数なら戻り値は使いませんということをコンパイラに通知できます。

    戻り値ありの関数呼び出しも本来なら戻り値を利用しないなら(void)func(arg);みたいに記述するのが良いと私は考えます。だって、戻り値を利用しないなら関数呼び出しをコンパイラが最適化して実行しなくても良いんじゃない?と判断されないようにしたいじゃないですか?そんなコンパイラには今まで遭遇したことないですが。

    コンパイラの最適化によっては関数で定義した自動変数は早い段階でスタックフレームからなくなります。関数内で自動変数を宣言して、それをポインタ渡しで関数呼び出ししたりして値を渡そうとした時、関数を呼んだら解放されて関数の先では意味不明な値を見ていたなんてことがSHのコンパイラでありました。この時もその関数を呼び出した次の行以降で(void)変数; を書くだけでコンパイラはちゃんと呼び出した関数の中でも値が正しく有効な値が渡せるようになります。

    なお、アルファプロジェクトさんのコードはコンパイラによっては警告が入って予期しない結果になる場合があるように思えます。マイコンが限定されているのでCC-RXでは上手くいっているのでしょうけど。

Reply
  • NoMaYさんが書いている通り(void)をもうこの先使用しない自動変数の先頭や関数呼び出しの先頭につけるという文法、これは比較的古いCの規格(C99ならExpression and null statementsに記載されています)から存在します。変数なら参照範囲の終了を明示し、関数なら戻り値は使いませんということをコンパイラに通知できます。

    戻り値ありの関数呼び出しも本来なら戻り値を利用しないなら(void)func(arg);みたいに記述するのが良いと私は考えます。だって、戻り値を利用しないなら関数呼び出しをコンパイラが最適化して実行しなくても良いんじゃない?と判断されないようにしたいじゃないですか?そんなコンパイラには今まで遭遇したことないですが。

    コンパイラの最適化によっては関数で定義した自動変数は早い段階でスタックフレームからなくなります。関数内で自動変数を宣言して、それをポインタ渡しで関数呼び出ししたりして値を渡そうとした時、関数を呼んだら解放されて関数の先では意味不明な値を見ていたなんてことがSHのコンパイラでありました。この時もその関数を呼び出した次の行以降で(void)変数; を書くだけでコンパイラはちゃんと呼び出した関数の中でも値が正しく有効な値が渡せるようになります。

    なお、アルファプロジェクトさんのコードはコンパイラによっては警告が入って予期しない結果になる場合があるように思えます。マイコンが限定されているのでCC-RXでは上手くいっているのでしょうけど。

Children
No Data