C++
[迷信] 今どき int が 16 ビットの処理系なんて無い
C/C++ の int 型が 16 ビット以上であることはよく知られています。正確には、その表現範囲が少なくとも -32767~+32767 ということになります(-32768~ではない点に注意)。しかし、現在 PC のプログラミングで広く使われている処理系では、かつて無償のコンパイラが入手しなかった時代に普及した LSI-C86試食版のようなごく一部の例外を除いて、int 型は 32 ビットです。int 型が 64 ビットの処理系もありますが、広く普及しているとはいいがたいので、原則として 32 ビットだと考えてよいでしょう。
では、int 型が 16 ビットの処理系は過去の遺物で、今では極例外的な存在でしかないのでしょうか? もし、本気でそのように考えているのであれば、井の中の蛙になっていることを疑わなければなりません。
現在でも、H8 や M16C、PIC など、組込み向けの処理系では int 型が 16 ビットのことは普通にあります。それらの処理系は、レガシーなものだといえばそうかもしれませんが、広く普及し、現在でも広く使われているわけですから、これらを無視して「今どき int が 16 ビットの処理系なんて無い」という論は成り立ちません。
[再発明] デバッガへの送信ストリーム
Windows 環境では、いわゆる printf デバッグを行うために OutputDebugString API を使用することがよくあります。この API は非常に単純で、使い勝手もそう悪くはありませんが、トレース情報の出力先をデバッガやらファイルやら標準出力やらに切り替えたいときには、FILE 型や std::ostream と交換できないためにやや面倒なこともあります。
そこで誰もが考えるのが、std::streambuf を継承して、OutputDebugString を用いて出力を行うクラスを作る、ないしはそのクラスを用いて std::ostream を継承したクラスを作るということです。そこで、今回は当サイトでも同じことを試みてみました。ただし、ほかでやっているのは std::streambuf::overflow をオーバーライドする実装が多いようですので、当サイトでは std::streambuf::xsputn をオーバーライドすることにしてみました。
[実験] PHP を C/C++ の前処理に使う
C/C++ ではプリプロセッサを使うことができます。それによって単純なマクロ機能を使うことはできるわけですが、ちょっと凝ったことをしようとすると、すぐに役不足になってきます。例えば、配列の要素を事前に整列するとか、静的な二分木や三角関数表をつくるといったことは、プリプロセッサではできません。
通常、こうしたことを行うには、別途何らかのコードジェネレータを作って、それに C/C+ のソースコードを生成させることになるわけですが、もっと簡単な方法があればそれに越したことはありません。今回は、埋め込み型のスクリプト言語である PHP を使ってこれを実現することを試みます。
PHP というと、ウェブ専用の言語だと誤解している人もいるかもしれません。しかし、実際の PHP はコマンドラインでも使うことができますので、通常のスクリプト言語として扱うこともできるわけです。しかも、同じソースファイルに PHP のコードと他の言語のコードを混在できますから、今回の目的にはぴったりです。
[迷信] char 型は符号付き
short, int, long と同じく、signed も unsigned も付けなければ、デフォルトで符号付きという類推が働くからか、あるいは普段使っている処理系がたまたまそうだったからか、char 型の表現範囲は -128〜+127 であると堅く信じているプログラマは少なくありません。
[迷信] 1 バイトは 8 ビットでも指摘したように、char 型は 8 ビットとは限りません。それだけでなく、char 型は符号付きか符号無しかも処理系定義です。ですので、char 型が -128〜+127 であるという決めつけは、これら二つの意味で間違っています。
[迷信] ソースファイルの末尾に }
これは迷信ではなく、よくある間違いです。この間違いの最悪なところは、書いた本人も、自分がどう書いたのかをほとんど自覚していないところにあります。実際、「ソースファイルの末尾に }」と指摘しただけでは、具体的にどういう状況なのか分からない場合も少なくないでしょう。
DirectX について書けといわれても...
最近、DirectX関連の技術について書いて欲しいという要望が少なくありません。専門学校の生徒からもそうした声が上がるわけですが、ちょっとお引き受けできないというのが正直なところです。というのも、DirectXについては、他人の受け売り以上のネタを持ち合わせていないからです。
ビジネス的な観点からいえば、他人の受け売りであれ何であれ、ウケのよい書籍を出せば利益は上がるのでしょうが、一応、最低限の良識は持っていますので、そんな仕事はしたくありません。それに、後ろめたい気持ちを持ちながら、企画を通すこともできそうにありません。
DirectXにかぎらず、一般受けしそうなネタ(DirectXは必ずしもそうではないかもしれませんが...)は多かれ少なかれそうしたところがあります。せっかく何ヶ月もかけて執筆する以上は、自分にしか書けないものを書きたいわけで、ある程度は妥協するにしても限度はあるわけです。
商業出版を目指す以上、書きたいものだけを書くというのも困難なわけですが、可能かぎりそれをめざしたいとは考えています。教育機関の内部だけで使う書籍の場合には、それこそ書きたいものとは著しく乖離しますから、これに手をつけるのは気持ちの上ではそれなりに敷居が高いのも確かです。
[迷信] 文字列から整数への変換には atoi
ごく普通のナル終端文字列 "123" を整数値の 123 に変換するとき、あなたはどんな方法を用いるでしょうか? 学校の課題でもないかぎり、1文字ずつ取り出して数字かどうかを判別し、数字なら取り出した文字から '0' を引いた値を元の値に 10 倍したものに加えていく...といった処理をわざわざ書くことはないでしょう(組込み用途のフリースタンディング処理系やライブラリ自体の開発の場合は別ですが)。
グローバル変数管理マクロを考える
「グローバル変数管理マクロ」と書くと、何のことか分からない方も少なくないと思います。他に適切な用語が思い浮かばなかったので、とりあえずこのような名前にしましたが、要するに次のようなマクロ定義のことです。
#define EXTERN extern
#else
#define EXTERN
#endif
ここで、使われているマクロ名は何でもかまいません。上記のようなマクロを使って、グローバル変数の定義と外部宣言の記述を楽にしようというものを、ここでは「グローバル変数マクロ」と呼ぶことにします。
C と C++ の違いを知りたい方へ
当サイトへは、連日多くの方々が、さまざまなキーワードで検索して来られます。その中でも、絶対数は多くはないものの、コンスタントに検索されているのが「C C++ 違い」かそれに近いキーワードです。以前、それに関して大まかな内容の記事を書いたことがありますが、もっと突っ込んだ内容を知りたい方にとっては物足りないはずです。
アドレスとポインタの違い
よくある説明では、アドレスとは変数や関数の位置を表す値であり、ポインタとはアドレスを格納するための変数であるとなっています。果たしてそうなのでしょうか? 標準規格であるJIS X3010:2003に目を通しても、「アドレスとは」あるいは「ポインタとは」という、ずばりそのものの記述が見つかりません。ただし、「ポインタ型とは」という記述であれば「6.2.5 型」に見つけることができます。
JIS X3010:2003の「6.2.4 オブジェクトの記憶域期間」には、
オブジェクトは,生存期間を通じて存在し,一定のアドレスをもち,最後に格納された値を保持する。
とありますので、少なくともオブジェクトに関しては、その位置を表す情報だと考えてよさそうです。ここで注意しなければならないのは、C規格でいうところのアドレスは、ハードウェア的なアドレスと必ずしも一致するわけでないということです。そう考えなければ、インタープリタ環境などは説明がつかなくなります。

