Gマイナー志向

とくに意味はありません

GCC 4.4時代のC++プログラミング(C++プログラマーの受難な日々の巻)

C++プログラマーや各ディストリビューションのパッケージメンテナーは必見。GCC 4.4 + glibc 2.10でハマらない為のテクニック。
詳しくはリンク先を参照。執筆者は今のGentoo界を牽引する我らがリーダー、Diego E. “Flameeyes” Petten〓先生。

Flameeyes's Weblog : How _not_ to fix GCC 4.4 bugs

ざっくり要約

#include <cstring>
int main() {
  char *foo = strchr("ciao", 'a');
}

は、GCC 4.3までは問題ないが、GCC 4.4だとエラーになるぜ。

error: invalid conversion from ‘const char*’ to ‘char*’

でも決してこんな対策はすんな。目をつぶってるだけだ。

#include <cstring>
int main() {
  char *foo = (char*)strchr("ciao", 'a');
}

で、こうするのがいいんだが、

#include <cstring>
int main() {
  const char *foo = strchr("ciao", 'a');
}

constになっちまうのは困るんだろ?じゃあこうだ。

#include <cstring>
int main() {
  char *foo = const_cast<char*>(strchr("ciao", 'a'));
}

つまり、型キャストはC言語流ではなくC++言語流でやれ、っつーことだ。

現時点でその影響が判明しているソフトウェア

で、Gentoo界ではFlameeyes先生が調査しまくってて各所で絶賛対応中
次の日本発(?)系ソフトウェアでも影響があることが判明している。

  • canuum
  • ochusha
  • scim-bridge
  • w3mmee

まだまだ他にもたくさんありそうだ。恐ろしや。

GCC 4.3も落とし穴があって大変だった*1が、GCC 4.4もパッケージメンテナー泣かせ。C++プログラマーの皆様、お願いだからしっかりきっちり書いてね。またはC++を使わないでくれ。

*1:ちゃんと#include しろとか2回#defineすんななど。