2009年04月08日(水) [長年日記]
- 久〜しぶりにC++を使ってる。
■ [c++] g++でCP932なソースをビルドしたらlexical_cast.hppでエラー
Ubuntu 8.10上でCP932で書かれたC++のソースコードを g++ に「-finput-charset=cp932」オプションを付けてビルドしようとしたら、boost/lexical_cast.hpp を include している個所でエラーになってしまった。
調べると、lexical_cast.hpp 内の最初のコメント内に
// who: contributed by Kevlin Henney, // enhanced with contributions from Terje Sletteb■,
とあって、■の所に0xf8が書かれておりそこで文字コード変換に失敗してしまうようだった。
ひとまず問題の文字を削除してしまうことで対処。
でも、include先のソースの文字コードは不明なケースがあるので、g++(gcc) の -finput-charset を使うのはよいアプローチではない気がしてきた。
■ [c++] g++ではおかしなフレンド関数がエラーになる
WindowsではビルドできていたソースをUbuntuのg++でビルドしているんだが、フレンド関数の所でエラーになった。
フレンド関数なんて使ったことないので知らなかったのだが、調べると関数に対してクラスのプライベートメンバへのアクセスを許可したいときに使うようだ。
んで、ビルドエラーになる箇所を見ると、そのクラスと無関係なフレンド関数を使おうとするとエラーになるみたい。サンプルを作ってみた。
class A { friend void f(A& a); // Aと関係している friend void g(); // Aと無関係 private: int secret; }; int main() { A a; f(a); g(); // ここがエラーになる return 0; } void f(A& a) { a.secret = 100; } void g() { }
これをg++でコンパイルすると、g()を呼び出す所でエラーになる。
$ g++ --version g++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ g++ -Wall friend.cpp friend.cpp: In function ‘int main()’: friend.cpp:11: error: ‘g’ was not declared in this scope
Windowsのコンパイラだとエラーにならないようだし、別にエラーにしなくてもいい気がするが、実装上の問題なのかな。 どうせなら呼び出し箇所ではなく宣言箇所でエラーになればいいのに。
■ [book] ジェネラル・ルージュの凱旋 (海堂尊)
読んだ。救命救急センターの「将軍」速水部長はできる男だという話。事件は何も起きなくて、病院内での政治の話が続く。
現場を率いる速水と対立する規約第一沼田助教授の振る舞いが、ソフトウェア開発現場を改善しようとするISO 9000活動とダブって見えて興味深かった。3.5点。
■ やること
換金