C標準ライブラリ』の無料サンプル版を公開しています。表現して、以下のような条件式を記述しているC言語のプログラムがあります。表現するときにも使われる可能性があるため、区別が付きにくい欠点があります。いった数も異なる意味を持っているかも知れません。多くのプログラミング言語では、真や偽を表す専用の型、および専用の名前付き定数が用意されています。いったものを使った方が、プログラムは分かりやすくなり、間違いを減らす効果もあります。これは、標準ライブラリではなく、int型のような、いつでも使える型として用意されています。ところが、真や偽に対応する名前付き定数は用意されていません。それぞれ使用できるようになります。標準的に備えている機能と同じになっています。0冒頭で説明した通り、_Bool型は完璧な論理型ではなく、単なる整数型の一種です。ある以上、やはり完璧を求めることはできません。以下のコードは問題なくコンパイルできてしまいます。変換される)とはいえ、完璧な論理型が提供されていないC言語では、この辺りには目を瞑らざるを得ません。同じものを定義すれば、ほぼ同じことができます。_Bool型も無いので、int型で代替することになります。この方法を採る場合、使っている外部のライブラリなどが、同じ目的の定義を行っていないかどうか注意して下さい。違った名前で同じ目的の定義が用意されていたら、混ぜて使うことが混乱の元になります。マクロは内容がまったく同じであれば、複数の箇所で定義されていても問題ありません。「b」のように書いた方が良いです。場合に、誤って偽であると判定されてしまいます。同じ考え方を、偽かどうかの判定にも適用するかどうかは意見が分かれるところです。「!b」のように書くと「!」を見落としやすく、かえって間違いに気付きにくいという意見もあります。対応状況この章で登場した関数やマクロなどの対応状況について、まとめました。7.1目的プログラムを書いているとき、プログラマはその場面ごとに何らかの想定をしています。「この変数には、データの件数が入っている。「この関数の引数には、呼び出し元にある変数を指すポインタが渡されてくるはずで、よってヌルポインタはあり得ない」といった具合です。ところが、出来上がったプログラムがいつも想定通りに動くとは限りません。同僚のプログラマが(あるいは自分自身が)、想定した通りの引数を渡さないかも知れません。問題はできるだけ早い段階で見つけることが重要です。想定外の状態であるとはいえ、その後しばらくは処理が正常に動いてしまう可能性はあります。プログラムが異常停止するような致命的な問題は、ずっと先の方で起こるかも知れないのです。そこから遡って根本原因を特定するのは大変です。そこで、想定外の状態を検出したら、プログラムの実行をただちに止めて、問題を報告するという機能が必要になります。一般に、このような機能をアサート(表明)と呼びます。C言語の標準ライブラリにも、必要最小限のアサート機能が用意されています。7.1C言語の標準ライブラリには、アサートの機能が用意されています。assertマクロを使用します。assertマクロを使っています。プログラムの実行が停止します。実引数の式が真になる場合には、何も起こりません。得られる内容が含まれます。出力されないようです。abort関数が使用されます。いうマクロが定義されている場合には完全な空になります。リリース段階では空の状態にすれば、条件チェックに伴う余分なオーバーヘッドを除去できます。インクルードよりも前で行う必要があります。定義することを伝える方法を使うことが多いでしょう。Releaseビルドでは定義されるようになっています。場合は、コンパイルオプション「-DNDEBUG」を指定してコンパイルします。プログラム内で定義する場合の例を示します。0;}あくまでもアサートは「想定外の」問題を検出するためのものであることに注意して下さい。アサートを使うことはできません。補足assertマクロによるチェックは、リリース時には無効化するのが普通です。assertマクロの実引数の部分で関数呼び出しを行っていたとすると、リリース時にはその関数は呼び出されません。プログラムの実行結果そのものが変わってしまう可能性があるので注意して下さい。0assertマクロの実引数のところに、関数呼び出しは記述しないのが無難です。前で変数に受け取り、変数の値をチェックしましょう。前で呼ぶassert(result);対応状況この章で登場した関数やマクロなどの対応状況について、まとめました。