2005-07-26
C++の実行環境には、大きく分けて2種類があります。
の2種類です。
ホスト環境は、OSの制御の下でプログラムが稼動する環境であり、フリースタンディング環境は、OSなしでプログラムが稼動する環境を指しますが、
μITRONのような小規模なOSの環境も、現実的にはフリースタンディング環境であるといえます。
Cにもホスト環境とフリースタンディング環境がありますが、CでもC++でも、
フリースタンディング環境ではエントリポイントがmainである必要がない他、移植性を損なわないための処理系のごく低水準な部分に関わるもの以外のライブラリは処理系定義になっています。 エントリポイントがmainである必要がないため、どんな型の、どんな名前の関数から始まってもよいわけです。また、μITRONのように決まったエントリポイントを持たない環境も許されます。C++では、非ローカルオブジェクトの初期化と、静的なオブジェクトの解体のみが規定されています。
ライブラリに関しては、移植性を損なわないための処理系のごく低水準な部分に関わるものに限り、サポートされています。移植性に配慮した設計・実装を行う場合は、それらの必ずサポートされるライブラリ以外を期待すべきではありません。
Cでは、フリースタンディング環境では以下のヘッダのみがサポートされます。
- <float.h>
- <limits.h>
- <stdarg.h>
- <stddef.h>
さて、標準Cにはいくつかのバージョンが存在しますが、C95
*1ではもう1つのヘッダがサポートされます。
さらには、C99
*2ではもう2つのヘッダがサポートされます。
面倒なのは、CとC++では、同じフリースタンディング環境であっても、サポートされるライブラリが異なる点です。以下にC++でサポートされるヘッダを挙げます。
- <cstdarg>
- <cstddef>
- <cstdlib>
- <exception>
- <limits>
- <new>
- <typeinfo>
このうち、<cstdlib>ではabort, atexit, およびexitのみがサポートされます。
C++の大きなセールスポイントのひとつは、Cの資産をそのまま再利用できる点にあります。しかしながら厳密なことをいえば、
使用するC++処理系と互換性のあるC処理系があるかどうかの保証はなく、ソースレベルであってもサポートされるライブラリの違いが若干の障壁となります。とはいうものの、現実の状況では、C++処理系のほとんどは互換性のあるC処理系をかねており、かつCのためのライブラリもC++から使用することができます。したがって、上記のような問題に実際に遭遇する機会はほとんどないと思われます。
むしろ、C++のための最低限のライブラリがサポートされていない(規格に合致しない)処理系の方が多いようです。C++で移植性の高いコードを記述するには、厳密な規格合致を目指すより、少なくとも現時点では、より現実に目を向けた方がよさそうです。
*1 ISO/IEC 9899:1990 Amd.1:1995のこと
*2 ISO/IEC 9899:1999のこと
Comment