C++
「私は現在、職業訓練校にて勉強し始めた初心者です。」の回答への反論
アクセス解析を見ると、教えて!gooの「私は現在、職業訓練校にて勉強し始めた初心者です。」という質問の回答から当サイトへのリンクが貼られたようです。それ自体は何の問題もありませんが、回答が間違っているようです。間違った回答を補強してしまうとすれば、当サイトにも若干の責任がありますので、ここで反論しておきます。
C言語の厳密な仕様・規格等については詳しくありませんが、#1さんが
書かれているとおり、
signed も unsigned も付けずに単に、char型として宣言した場合、
符号付き(signed)となるか、符合無し(unsigned)となるかは、
言語仕様としては【未定義】であり、
その扱いは、処理系依存(コンパイラにより定義が異なる)
となるようです。(※下記参考サイト参照)
回答では上記のように記されています。字下げの部分はあたかも引用したように見えますが、当サイトも、もうひとつリンクを貼られたサイトにもこのような記述はなく、#1の回答にもこうした記述はありません。
未整理エントリー
ここには、「C++ろ組込み環境」に収録を検討しているけれども、まだ整理されていない記事を集めることにします。必然的に乱雑なものになりますし、内容の正確さについても十分な検証がなされていない可能性が高いと考えてください。
擬似プロセッサの新作を作ってみました。
まだテストもしきれていませんし、コードも雑なのですが、擬似プロセッサの新作を作ってみました。
http://www.kijineko.co.jp/files/pt2010-20100225.zip
他にやらなければならないことが山積なのですが、あいにく風邪で体調が悪く、混みいったことはできそうにないので、思いっきり現実逃避した結果の成果物です。
今回はC++で実装し、レジスタにはboolの配列を使いました。当然、加減算器は半加算器をもとに作った全加算器を組み合わせて使っています。ステータスフラグもあれば、マスク可能な割り込み(ただし優先度はなし)も作ってみました。外部I/Oはコールバック関数で処理するようにしましたので、どんな足回りでも外付けすることができます。まだドキュメントがありませんので、そのうち解説記事を書くようにします。
ところで、擬似プロセッサという呼称はいまいちよくなくて、本当は仮想プロセッサと呼ぶべきなのでしょうが、そう呼ぶと別のものを想像してしまったりするので、あえてこう読んでいます。
C++における構造体の初期化
「[迷信] とりあえず memset で初期化」へのアクセスは相変わらず多いのですが、解説があっさりしているために十分意図が伝わっていないことも少なくないようです。これまでも何度か補足的な解説を行ってきたのですが、今回もその一環として、補足解説を行うことにします。
一般的な話をすると、どうしても解説が抽象的になってしまい、その結果またしても十分に意図が伝わらないということが起きそうです。そこで、今回は解説の対象を絞り込み、できるだけ具体的な話をするつもりです。今回対象とするのは「C++の構造体の初期化」です。Cの話ではありません。また、「初期化」と書いていますが、いわゆる初期化子による初期化だけでなく、最初に値を設定する意味上の初期化も対象とします。
JIS X3014の値初期化の記述に悩まされる
すでに誰かが指摘していることなのだとは思いますが、JIS X3014:2003の「値初期化」の記述にさんざん悩まされました。今回は非常にデリケートな話なので、規格からの引用は転記でなく、キャプチャ画像を貼ることにします。
まず、順を追ってお話することにします。C互換型ではないクラス型の初期化について確認しようと思い、JIS X3014:2003の12.6 初期化に目を通しました。

これによると、初期化子が()の場合は「値初期化」されることになっています。つまり、std::string()のような記述を行った場合は値初期化されるわけです。
次に、値初期化について確認しようと思い、8.5 初期化子の記述に目を通しました。
[迷信] 引用符で囲んだヘッダ名はカレントディレクトリから探索する
あるディレクトリ(~/srcとします)に、foo.cとbar.hという二つのソースファイルがあったとします。bar.hは、foo.cから次のようにインクルードしています。
ここで、別のディレクトリ(~/workとします)でfoo.cをコンパイルしたとしましょう。このとき、foo.cからインクルードしているbar.hは、期待通り~/src/bar.hを探し当てることができるでしょうか?
今度は、~/src/bar.hとは別に、~/work/bar.hというファイルを用意してみましょう。そして、先ほどと同じように、~/workで~/src/foo.cをコンパイルしてみます。このときに~/src/foo.cから取り込むbar.hは、~/src/bar.hでしょうか? それとも、~/work/bar.hでしょうか?
もし、引用符で囲まれたヘッダ名はカレントディレクトリから探索するのであれば、~/work/bar.hが取り込まれるはずですが、本当にそうなるでしょうか?
ビルドエラーと実行時エラーの区別が付かない?
最近感じることですが、IDEが便利になったせいか、ビルドエラーと実行時エラーの区別がつかない人が増えているようです。もう少し具体的にいうと、Visual Studioの場合、コーディングを行うとすぐにCTRL + F5で実行させようとします。IDEは、ビルドを実行し、ビルドに成功すればデバッグなしで実行するわけですが、この過程でエラーが発生すると、単に「エラーが出た!」というだけの認識しか持たず、どんな過程でどんなエラーが出たのかを確認しようとしないのです。
仮に実行時エラーだということが理解できても、CTRL + F5でデバッグなしで実行するものですから、デバッガで調べようという発想がありません。ブレークポイントやステップ実行を教えてあげると、驚くほど感動されたりします。デバッグなしで実行するのは、おそらく、デバッグ開始にすると、コンソールアプリケーションではプログラム終了時にコンソールが閉じてしまうために、そういう指導を受けたのではないかと思います。
意外に使いにくい C++ の新ライブラリ
最近では、TR1 や C++0x(C++1x といったほうが正確か?)にある程度対応した処理系も増えてきました。ところが、対応状況が中途半端な上に、処理系ごとにいろいろとローカルルールがあるので御しにくいのも事実です。移植性のことを考えなければ問題ないのかもしれませんが、移植性を気にしだすと、Visual C++ と GCC に限っても、結構めんどうです。
対象とするのを、Visual C++ 2008(2010 はまだベータなので考慮しません)と GCC 3.4 以上(Cygwin とか考慮すると、どうしてもそうなります)に絞ったとします。その場合でも、インクルードすべきヘッダの違い、名前空間の違いがあり、それらを自動判別してやらなければなりません。
Visual C++ の場合、一部しか対応していないとはいえ、基本的に TR1 の仕様通りの使い方ができます。すなわち、tuple を使いたいのであれば、<tuple> をインクルードし、std::tr1 名前空間にあるものとして扱えばよいことになります。
[迷信] abs は常に非負の値を返す
abs 関数というのは絶対値を求める関数です。C では int 型の引数を受け取り int 型の値を返します。C++ では、int 版以外に、long 版、float 版、double 版、long double 版、std::complex クラステンプレート版が多重定義されています。絶対値を求める関数ですから、ゼロまたは正の値を返すのが数学的に正しい振る舞いです。
ところが、現実には必ずしもそうはならない場合があります。まずは、浮動小数点数や複素数の引数として非数(NaN)が渡された場合がそうです。これについては、それほど大きな問題になることはないでしょう。問題は整数の場合です。
abs 関数に INT_MIN を与えた場合を考えてみてください。負の値の内部表現に 2 の補数を使う処理系(実質的にすべての処理系と考えても、あながち間違いとはいえません)では、INT_MIN の絶対値は INT_MAX + 1 になることが大多数です。つまり、INT_MIN の絶対値を int 型で表現することができなくなるのです。
[迷信] argv[0] はプログラム名
main 関数が argc と argv の二つの仮引数を受け取る場合、argv[0] がプログラム名を表す文字列を指すというのは入門書にも載っています。しかし、常にそうかというと、「そうではない」としかいえなくなります。今回はフリースタンディング環境の話は除外して、ホスト環境の話に限って、この部分の事実関係がどうなっているかをご紹介します。
argv[0] がプログラム名にならないケースは、大きく分けて二つあります。ひとつは、そのそも main 関数にプログラム名が渡されないケースがある場合であり、もうひとつは、ユーザープログラムから main 関数を呼び出した場合です。
まずは、そもそも main 関数にプログラム名が渡されないケースについて見ていきます。JIS X3010:2003 の 5.1.2.2.1 プログラム開始処理から引用すると...

