C と同様、C++ もさまざまな実行環境で動作するプログラムを記述することができます。実際にどの程度使われているかは別として、メインフレームから 8 ビットマイコンまで、(4 ビットマイコンのような一部の例外を除き)あらゆるコンピュータで C++ プログラムを動作させることが想定されています。
もちろん、そのように実行環境が大幅に異なれば、それぞれの環境に備わっている機能もさまざまです。無理をしてすべてを共通的に扱おうとすれば、どんなに高機能な環境でも 8 ビットマイコンと同程度の機能しか期待することができなくなってしまいます。
そこで、C/C++ では、(フルセットの)オペレーティングシステムの支援が得られるかどうかを目安に、実行環境を大きく次の2種類に分類しています。
そして、実行環境がフリースタンディング環境である処理系をフリースタンディング処理系、実行環境がホスト環境である処理系をホスト処理系と呼んでいます。注意しないといけないのは、原文では同じであるにもかかわらず、C++ 規格では「自立処理系」および「依存処理系」という訳語を使用しています。ここでは、よりなじみの深い C 規格の用語である「フリースタンディング~」と「ホスト~」を使用したいと思います。
フリースタンディング環境
フリースタンディング環境は、オペレーティングシステムの支援を受けない実行環境のことです。組み込み機器の多くはフリースタンディング環境に分類されます。また、オペレーティングシステムの支援がある場合でも、μITRON のようなカーネルのみで構成される OS の場合も、やはりフリースタンディング環境に分類すべきです。
フリースタンディング環境の最大の特徴は、プログラムが main で始まるとは限らない点です。プログラムの開始処理となる関数は、その名前も型も処理系定義になります。
フリースタンディング環境のもうひとつの特徴は、標準ライブラリの
大部分がサポートされない点です。具体的には、C の場合、フリースタンディング環境でサポートされるライブラリは次のとおりです。
<float.h><iso646.h>C95<limits.h><stdarg.h><stdbool.h>C99<stddef.h><stdint.h>C99
このうち、右肩にC95とかC99とあるのは、そのヘッダがサポートされるようになった C 規格のバージョンです。ご覧いただければわかるように、フリースタンディング環境では、型とマクロの定義以外はサポートされないことになります。
先ほどは C の場合でした。では C++ はどうかというと、C++ のフリースタンディング環境でサポートされるライブラリは次のとおりです。
<cstdarg><cstddef><cstdlib>(abort, atexit, exitのみ)<exception><limits><new><typeinfo>
C++では型とマクロだけではありませんが、それ以外は、前回お話した基本言語仕様を支えるランタイムに関するものです。また、<cstdarg> 等に対応する <stdarg.h> 等がサポートされるのかも規格では明確に示されていません。
C++ のセールスポイントのひとつは、C の資産をそのまま利用できる点にあります。しかし、フリースタンディング環境に関しては、これまで見てきたように、サポートされるライブラリが C と C++ では異なります。そのため、たとえソースレベルであっても、サポートされるライブラリの違いが、C から C++ への移行にあたっては若干の障害となります。
ただ、現実的には C++ 処理系は C 処理系を兼ねる場合も多く、C で使えたライブラリは C++ でもそのまま使えると考えてまず問題はないでしょう。むしろ、C++ で本来サポートされるはずのライブラリがサポートされないケースの方が多く、現実に目を向けるなら、C++ でも C でサポートされるライブラリを基準に考えた方がよさそうです。
ホスト環境
ホスト環境は、オペレーティングシステムの支援を受けて動作する実行環境のことです。Windows*1とかLinuxなどが典型的なホスト環境にあたります。ホスト環境では、ファイルシステム、暦時間、環境変数、コマンドプロセッサといった機能の一部または全部を利用することができます。
C/C++ を扱った多くの入門書や解説書は、暗黙的にホスト環境を想定しているようです。ホスト環境については資料も多いことですし、ここであえて詳しく取り上げる必要はないでしょう。
WinMain だったりするのは、フリースタンディング環境とみなさなければ規格に合致しないという見方もありますが...。

