京都C++勉強会の宣伝のために、CとC++の違いを、少しづつ解説することにした。
江添とボレロ村上の京都C++勉強会が、12月16日に行われる。これを書いている時点では、まだ空きがあるので、最新のC++14の新機能と、コンパイル時レイトレーシングを勉強したければ、ATNDで参加申し込みをせよ。
江添とボレロ村上の京都C++勉強会 | 集客ならイベントアテンド
C++はCの完全互換ではない。Cのあまり良くない部分は、変更して改良した。ここでは、そのような変更点のうち、互換性に特に問題のあるものを取り上げる。
今回は、字句編だ。
新しいキーワード
C++では、新しいキーワードが追加されている。C++で追加されたキーワードを名前に使っているようなCコードは、問題になる。
文字リテラルの型がintからcharに変更
Cでは、'a'の型は、intだった。これは、オーバーロード解決で問題になる。
// 実装依存の整数が出力される std::cout << 'a' ;
C++では、文字リテラルの型をcharに変えた。
これにより壊れる可能性のあるコードとしては、sizeof('x')のようなコードが想定されている。しかし、そのようなコードはあまり多くないだろう。
文字列リテラルの型がconstになった。
Cでは、文字列リテラルの型はconstではなかった。C++ではconstだったが、C++03までは、文字列リテラルに限り暗黙にconstを消し去ることを認めていた。C++11では、そのような標準変換もなくなったので、以下のようなコードはエラーとなる。
// エラー char * ptr = "hello" ;
このようなコードは、そもそも適切ではない。文字列リテラルの指し示すストレージを書き換えた結果は未定義だからだ。案外まだ、このような不適切なコードは残っているのではないだろうか。
明日も、宣伝のためにBasic Conceptsの変更点を解説する。
江添とボレロ村上の京都C++勉強会が、12月16日に行われる。これを書いている時点では、まだ空きがあるので、最新のC++14の新機能と、コンパイル時レイトレーシングを勉強したければ、ATNDで参加申し込みをせよ。
No comments:
Post a Comment