本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP aC++/HP ANSI C バージョン A.06.05 リリースノート > 第1章 HP aC++/HP ANSI C リリースノート

既知の問題と回避策

≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

サポート契約を結んだユーザーは、製品番号を使って HP aC++ または HP C 用の SSB および SRB レポートを見つけることができます。検索する製品番号は B3910BA です。

ご使用の HP aC++ または HP C の製品番号とバージョンを確かめるには、次のような HP-UX コマンドを実行します。

what /opt/aCC/bin/aCC

what /opt/aCC/lbin/ecom

what /opt/ansic/bin/cc

what /opt/ansic/lbin/ecom

次に、既知の問題とその回避策を示します。

最適化レベル 4 で作成されたオブジェクトファイル

コンパイラの最適化レベル 4 で作成されたオブジェクト (中間オブジェクトファイル) は、一時ファイルとしてのみ使えます。これらのオブジェクトファイルには、ユーザーコードの中間表現が、高度な最適化のために設計されたフォーマットで入っています。当社は、コンパイラの新版のリリースやパッチに伴ってこれらのファイルのフォーマットを予告なしに変更する権利を、留保しています。中間ファイルの使用は、そのファイルを作成したコンパイラだけに限らなければなりません。同じ理由で、異なるバージョンのコンパイラで使われる可能性のあるアーカイブライブラリには、中間オブジェクトファイルを入れないでください。

互換性のない中間ファイルを検出した場合、コンパイラはメッセージを出力して終了します。

C++ 標準ライブラリバージョン 1.2.1 とドラフト標準との非互換性

ANSI C++ 標準は度々改訂されていますが、改訂の都度、C++ 標準ライブラリが変更されている訳ではありません。関数ヘッダーファイル functional のtimes 関数オブジェクトなどがその例です。ANSI C++ 標準では、timesmultiplies に名前が変更されています。

multiplies を使用してコードを記述する場合は、ISO/ANSI C++ 標準と互換性を持つように、aCC コマンド行で条件付きコンパイルフラグを使用してください。

たとえば、次のプログラムであれば、次のようなコマンド行でコンパイルしてください。

    aCC -D__HPACC_USING_MULTIPLIES_IN_FUNCTIONAL test.c
// test.c
int times; //user defined variable
#include <functional>
// multiplies can be used in
int main() {}
// end of test.c

現在の A.05.* および A.06.* コンパイラは自動的に次のようなフラグを設定します。

  • -D__HPACC_USING_MULTIPLIES_IN_FUNCTIONAL

  • -D__HPACC_THREAD_SAFE_RB_TREE

  • -D__HPACC_USING_MULTIPLIES_IN_FUNCTIONAL

  • -D__HPACC-FIX_FUNC_ADAPTER_OPERATOR

  • -D__HPACC_FULL_ITERATOR_REL_OPS

  • -D__HPACC_TEMPLATE_PAIR_CTOR

  • -D__HPACC_MEM_FUN_ADAPTOR

macros.h と numeric_limits クラス (min および max) の競合

コードに/usr/include/macros.h が含まれる場合は、 macros.h で定義されている min マクロおよび max マクロが、C++ 標準ライブラリのnumeric_limits クラスで定義されているmin 関数およびmax 関数と競合することに注意してください。たとえば、次のコードはコンパイラ Error 134 を生成します。

numeric_limits<unsigned int>::max();

macros.h ヘッダーを使わなければならない場合は、競合するマクロを定義しないようにしてください。

...
#include <macros.h>
#undef max
#undef min
...

既知の制限事項

このリリースに関する既知の制限事項を以下に示します。これらの制限事項のいくつかは、HP aC++ の今後のリリースで取り除かれる予定です。制限事項の中には特定のプラットフォームでのみ生じるものがある点に注意してください。

  • HP aC++ の <iostream.h> および<iostream> は、大容量 (2 GB を超える) ファイルをサポートしていません。

  • 直接参照されていないオブジェクトについては、シンボリックデバッグ情報が必ず出力されるとは限りません。たとえば、オブジェクトへのポインターが使用されているにもかかわらずフィールドが参照されていない場合、HP aC++ は、ポインターの型のシンボリックデバッグ情報のみを出力し、ポインターが示すオブジェクトの型については出力しません。たとえば、 Widget * を使用すると、ポインター型Widget * のデバッグ情報が出力されるだけで、Widget は出力されません。そのような情報が必要な場合は、その型 ( Widget) のパラメータを持つダミー関数を定義するソースファイルを新たに作成し、実行可能プログラムにリンクします。

  • 例外処理機能の既知の制限事項

    • setjmp/longjmp との相互運用性 (C++ 国際標準試案でも未定義) は実装されていません。 longjmp を実行しても、デストラクタは実行されません。

    • プログラムの初期化段階 (つまり、メインプログラムの実行前) に未処理の例外が生じた場合、生成されたオブジェクトによってはデストラクタが実行されない場合があります。

    • HP aC++ は、リンカーオプション -Bsymbolic をサポートしていません。 共有ライブラリから型を削除する場合は、コンパイル時オプション -Bprotected_def を使用してください。 この制限事項は、dynamic_cast および RTTI にも適用されます。

  • シグナル処理機能の既知の制限事項

    • シグナルハンドラーからの例外の送出はサポートされていません。これは、シグナルは、破壊可能オブジェクトの値がレジスタ内に一時的に保存されているようなコードの最適化された領域など、どこででも発生する可能性があるためです。例外処理はメモリー内で更新中の破壊可能オブジェクトによって決まりますが、この状態が保障されているのは、呼び出し場所だけです。

    • 例外の発生がサポートされていないため、シグナルハンドラーで longjmp を実行することも同様にお勧めしません。シグナルハンドラーがコードの処理を中断すると、データ構造が未定義となって、予測不可能な結果に陥ります。

  • C++ 共有ライブラリのソースレベルのデバッグはサポートされています。ただし、メンバー関数が共有ライブラリで宣言されているクラスで、そのクラスが定義されている共有ライブラリ以外で宣言されているオブジェクトを持つものである場合、C++ 共有ライブラリのデバッグに関して制限があります。オペレーティングシステムおよびデバッガのリリースノートおよびマニュアルを参照してください。追加の詳細情報については、Software Status Bulletin も参照してください。

  • 共有メモリー上の仮想関数での共有オブジェクトのインスタンス生成はサポートしていません。

  • ライブラリレベルのバージョニングでの shl_load(3X) またはdlopen(3C) の使用

    ライブラリレベルのバージョニングを行うと、shl_load() またはdlopen()(shl_load(3X) を参照) への呼び出しでは、ロードするライブラリの実際のバージョンを指定する必要があります。

    たとえば、libA.so が現在libA.so.1 のシンボリックリンクの場合、このライブラリをダイナミックにロードする呼び出しでは、アプリケーションがコンパイルされたときの最新バージョンを指定する必要があります。たとえば、次のようになります。

    shl_load("libA.so.1", BIND_DEFERRED, 0);

    つまり、libA よりも後のバージョンを利用できるシステムにアプリケーションが移行された場合、実際に必要なバージョンはダイナミックにロードされるものであることが保証されます。

  • メモリー割り当てルーチン alloca()

    コンパイラは、/usr/include/alloca.h ヘッダーファイルで定義されているビルトイン関数 alloca をサポートしています。alloca() ルーチンの実装はシステムに依存するので、使用はお勧めしません。

    alloca()malloc() と同様のメモリー割り当てルーチンです (malloc(3C) を参照)。構文は次のとおりです。

    void *alloca(size_t <size>);

    alloca() は呼び出し元のスタックから、少なくとも<size> バイトのブロックに領域を割り当てますが、領域の初期化は行いません。呼び出しルーチンが終了すると、領域は自動的に解放されます。

    注記: alloca() で返されたメモリーは、他のメモリー割り当て関数によって割り当てられたメモリーとは関連がありません。alloca() で返されたアドレスを、他のメモリー関数のパラメータとして渡したときの動作は定義されていません。

    この関数を使用するには、<alloca.h> ヘッダーファイルを使用しなければなりません。

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 2005 Hewlett-Packard Development Company, L.P.