[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 メーリングリストの案内