[Armadillo:05021] Re: CON16 (シリアルインターフェース1)のリブート時のメッセージ抑制
Yasuhisa Nakamura
email@hidden
2010年 3月 13日 (土) 00:17:40 JST
中村です。
[Armadillo:05019]で花田さんwrote:
> さらに、本当に余談でしかないですが…Cでは原則どおりにならない例がありまして。
>
> char hoge[3] = { 'a', 'b', 'c' };
> char hoge[3] = "abc";
>
> この2つはCとして正しくコンパイルが通ります。
> NULL補完はされず、プログラマの(多分)期待通りにchar型3つの配列ができあがります。
>
> ところが、これをC++としてコンパイルすると、エラーになります。
> C++では文字列は必ずしっかり文字列(ただのchar型配列ではないということ)として
> 扱われるため、文字列リテラルの時点で必ずNULL補完され、
> サイズが3しかないhogeへの初期化要素としてサイズオーバーと判定されるからです。
> …CとC++の細かな言語仕様の違いの例として、よく取り上げられるお話でした。
おそらく自分の過去の経験で、C++でこれに遭遇したこと(この
コンパイルエラーになったこと)はないと思うのですが、CとC++で
こういう違いもあったんですね。(こういうエラーに出くわした
ことがないので違いを知らなかった、ということです)
Cは昔々K&Rで、C++はなんとなくいつの間にか・・・、ANSI-Cも
なんとなくですし、C99とかgcc拡張とか、普段自分で使っている
書きかたがどの仕様のものなのかわからなくなってきてて、
便利な反面、あぶなっかしいところもありますね。
花田さんの
> ....プログラマの(多分)期待通り....
というあたり、ニヤニヤしながら読ませてもらいました。
--
なかむら
armadillo メーリングリストの案内