Skip to main content

IAR Embedded Workbench for Arm 9.70.x

C++の機能の説明

このセクションの内容:

IAR C/C++コンパイラfor Arm用のC++ソースコードを記述する際、C++ の機能(クラス、クラスメンバなど)とIAR言語拡張(IAR固有の属性など)を組み合わせる場合の利点や、特異な動作の可能性について認識しておく必要があります。

C++クラスの静的データメンバは、グローバル変数と同じように処理され、適切なすべてのIAR型とオブジェクト属性を持つことができます。

原則的にメンバ関数は解放された関数と同じように扱われ、適切なすべてのIAR型とオブジェクト属性を持つことができます。仮想メンバ関数はデフォルトの関数ポンタと互換性のある属性しか持つことができません。コンストラクタとデストラクタはこうした属性を持つことはできません。

位置演算子@#pragma locationディレクティブは、静的データメンバ上および、すべてのメンバ関数とともに使用することができます。

C++は、C++標準に従ったテンプレートをサポートします。実装では、2段階のルックアップを使用します。すなわち、必要なときには常にtypenameキーワードを挿入する必要があります。さらに、テンプレートを使用するたびに、使用可能なすべてのテンプレート定義が可視になる必要があります。すなわち、すべてのテンプレートの定義がインクルードファイルまたは実際のソースファイルに存在する必要があります。

extern "C"リンケージを持つ関数型は、C++リンケージを持つ関数と互換性があります。

extern "C" 
{
  typedef void (*FpC)(void);    // A C function typedef
}

typedef void (*FpCpp)(void);    // A C++ function typedef

FpC F1;
FpCpp F2;
void MyF(FpC);

void MyG()
{
  MyF(F1);                      // Always works
  MyF(F2);                      // FpCpp is compatible with FpC
}

割り込み関数が、(コンストラクタを使用して)生成または(デストラクタを使用して)破棄しなければならない静的クラスオブジェクトを使用する場合、オブジクトの生成前、または破棄の後や途中に割り込みが発生すると、アプリケーションが正しく機能しなくなります。

これを回避するために、静的オブジェクトが構築されるまで、これらの割り込みが有効になっておらず、mainから戻ったり、exitを呼び出すときに無効になっていることを確認してください。システムの起動について詳しくは、システムの起動と終了を参照してください。

関数ローカルの静的クラスオブジェクトは、実行が最初に宣言を通過すると生成され、mainら戻ったり、exitを呼び出す際に破棄されます。

メモリの枯渇に対応するには、set_new_handler関数を使用します。

例外が有効な状態での標準C++ のNEWハンドラ

set_new_handlerを呼び出さないか、NULL newハンドラを使用して呼び出す場合、例外が有効になっていて演算子 newが十分なメモリの割当てに失敗すると、演算子 newstd::bad_allocをスローします。例外が有効でない場合、演算子 newは代わりにabortを呼び出します。

NULL以外の newハンドラを用いてset_new_handlerを呼び出す場合、operatornewが十分なメモリの割当てに失敗すると、operatornewによって、提供されたnewハンドラが呼び出されます。newハンドラはより多くのメモリを使用できるようにして戻るか、何らかの形で実行を中止する必要があります。例外が有効な場合、newハンドラはstd::bad_alloc例外をスローすることもできます。演算子 newの派生型nothrowは、例外が有効でnewハンドラがstd::bad_allocをスローする場合に、newハンドラがある状態でのみNULL を返します。

例外が無効な状態での標準C++ のNEWハンドラ

set_new_handlerを呼び出さないか、NULL newハンドラを使用して呼び出す場合、operator newが十分なメモリの割当てに失敗すると、abortが呼び出されます。new演算子の派生型nothrowは、代わりにNULLを返します。

NULL以外のnewハンドラを用いてset_new_handlerを呼び出す場合、operatornewが十分なメモリの割当てに失敗すると、operatornewによって提供されたnewハンドラが呼び出されます。newハンドラはより多くのメモリを使用できるようにして戻るか、何らかの形で実行を中止する必要があります。operator newの派生型nothrowは、newハンドラがある状態でNULLを返すことはありません。

これは、newの派生型nothrowを使用しているのと同じ動作です。

C-SPYデバッガには、STLコンテナ用に組込みの表示サポートがあります。コンテナの論理構造は、わかりやすく追跡しやすい方法で包括的に[ウォッチ]ビューに表示されます。

C++を使用すると、throw文の位置や、引き起こされた例外に対応するcatch文がない場合に、C-SPYを停止させることができます。

詳細については、C-SPY デバッガの特長』を参照してください。