RL78CS+ forCCでソフトを作っています。例えば、関数 void xxfunc(uint32_t, uint32_t) があったとします。メインで、 uint16_t aa; uint16_t bb; aa = 1000; bb = 6000; xxfunc(aa, bb);でコンパイルします。引数の型が合わないのでワーニングが出ると思いましたが出ませんでいた。暗黙の型変換だと思います。このような場合でもワーニングを出すことはできますか?
ega258さん、こんにちは。NoMaYです。CC-RLにその機能は無い筈です。CC-RLのコンパイラのヘルプを見直しても見当たらないです、、、CC-RXと話がごっちゃになっているのでしょうか?それとも私の見落としなのかな?IKUZO wrote:> インフォメーション・メッセージ出力を有効にするをはいにするとega258 wrote:> cs+では確認できました。
IKUZOさん、こんにちは。NoMaYです。その機能は、CC-RXにはありますが、CC-RL(とCC-RH)には無いのです。そして、CC-RXで検出されていても、今回は、RL78とCC-RLでのことなのです。この3種類のコンパイラは、必ずしも同一の仕様という訳ではなくて、C言語拡張仕様やコマンドラインオプションがそれなりにばらついています。そして、ワーニングレベルに関しては、CC-RXが最も高い設定が出来るような感じになってますね。
NoMaYさん CS+でもいろいろあってega258さんのはCC-RXでなくてCC-RLだったんですね 気が付くのが遅かったですね、なるほど思い込みで回答してたみたいです CC-RXのコンパイラーはCC-RLよりも親切というわけなんでしょうか コンセプトの違いなんでしょうか、uint16_tをuint32_tに変換する等とは0x7FFFをuint32_tでは変わらず0xFFFFであれば0xFFFFFFFFとなって不安ではありますが 理解していれば特に危険ではないように思いますが
この私の理解で正しかったですかね?
IKUZOさん
> 65534をuint32_tでは変わらず0xFFFFであれば0xFFFFFFFFとなって不安ではありますが
私が勘違いしているのでなければ勘違いされてるような気がします。
0xFFFFをuin32_tでキャストしても値は保持されるので、0xFFFFのままですね。
(-1)をuin32_tでキャストしたときは0xFFFFFFFFになるので、これと勘違いされてるのかと。
以下gccでの結果です。
$ cat test3.c #include <stdio.h>#include <stdint.h> int main(void) { uint16_t u16_m1 = (uint16_t)-1; uint32_t u32_cast = u16_m1; uint32_t u32_m1 = (uint32_t)-1; printf("0x%x: 0x%x: 0x%x\n", u16_m1, u32_cast, u32_m1); } $ gcc test3.c $ ./a.out 0xffff: 0xffff: 0xffffffff $
IKUZOさん、
> uint16_tをuint32_tに変換する等とは
> 0x7FFFをuint32_tでは変わらず0xFFFFであれば0xFFFFFFFFとなって不安ではありますが
uint16_t の値を uint32_t への変換では上位 16bit にゼロ拡張されるだけなので値に変化は生じません。
Wandboxで実行
符号ありの値をよりサイズの大きな符号なしの型に変換した場合には仰られてるような符号拡張が行われるため注意が必要となります。