C/C++標準ライブラリの概要
コンパイラには、2つの異なるC/C++ 標準ライブラリの実装があります。
IAR DLIB ランタイム環境 は、CおよびC++の低レベルなサポートを提供します。このランタイム環境を使用しているときは、2つのライブラリの選択肢があります。
IAR DLIB C/C++ ライブラリは、標準のC/C++に準拠するC/C++標準ライブラリの完全な実装で、スレッド関連の機能を除く標準CおよびC++14に準拠しています。これにはロケール、ファイル記述子、マルチバイト文字など異なるレベルのサポートを含めるように設定することもできます。
IAR Libc++ ライブラリは、標準のC/C++に準拠するC/C++標準ライブラリの完全な実装で、並列アルゴリズム、実行ポリシー、スレッド関連および
filesystem関数の機能を除く標準CおよびC++17に準拠しています。Libc++ライブラリは、オープンソースライセンスでLLVMから取得されます。また、C++17標準からの拡張と制限でそのまま使用されます。このテキストのリリース時点でのバージョンは libc++v16 です。LLVM Libc++ ライブラリの機能セットの詳細については、 https://libcxx.llvm.org/Status/Cxx17.html を参照してください。
これらの実装はどちらもIAR DLIBランタイム環境の上位にビルトインされ、どちらの実装もIEEE 754 フォーマットの浮動小数点の数値をサポートします。この環境についての詳細、およびDLIB ライブラリのカスタマイズ方法については、DLIBランタイム環境のを参照してください。
ライブラリ関数の詳細情報については、製品とともに提供されるarm\docディレクトリにある HelpDLIB6.chmファイルを参照してください。Libc++ライブラリ関数についての参照情報はありません。
ライブラリ関数の詳細については、処理系定義の動作のセクションを参照してください。
ヘッダファイル
アプリケーションプログラムは、ヘッダファイルを通じてライブラリ定義にアクセスします。ヘッダファイルは、#includeディレクティブを使用して組み込みます。ライブラリ定義は、複数の異なるヘッダファイルに分割されています。各ヘッダファイルは、特定の機能領域に対応しており、必要なものだけをインクルードできます。
ライブラリ定義を参照する前に、該当ヘッダファイルをインクルードする必要があります。これを行っていない場合、実行時に呼び出しに失敗するか、コンパイルやリンク時にエラーやワーニングメッセージが出力されます。
ライブラリオブジェクトファイル
ほとんどのライブラリ定義は、修正なしで、すなわち製品付属のライブラリオブジェクトから直接使用できます。ランタイムライブラリの設定方法については、ランタイム環境の設定を参照してください。リンカは、アプリケーションで直接的または間接的に必要なルーチンのみを含めます。
独自バージョンでライブラリモジュールを上書きする方法については、ライブラリモジュールのオーバライドを参照ください。
より高精度な代替ライブラリ関数
cos、sin、tan、およびpowのデフォルトの実装は、高速かつ小さくなるように設計されています。もうひとつの方法として、より高い精度を提供するように考えられたバージョンがあります。関数のfloatバリアントは__iar_xxx_accuratef、関数のlong doubleバリアントは __iar_xxx_accuratel、xxxはcos、sinなどです。
より正確な以下のバージョンを使用するには、--redirectリンカオプションを使用します。
リエントラント性
関数をメインのアプリケーションや任意の数の割り込みで同時に呼び出すことが可能な場合、その関数はリエントラントであると言います。したがって、静的に割り当てられたデータを使用するライブラリ関数はリエントラントではありません。
DLIBランタイム環境の大部分はリエントラントですが、以下の関数や部分は静的データを必要とするためリエントラントではありません。
ヒープ関数 —
malloc、free、realloc、callocなど、C++演算子newおよびdeleteロケール関数 —
localeconv、setlocaleマルチバイト関数 —
mblen、mbrlen、mbrtowc、mbsrtowc、mbtowc、wcrtomb,wcsrtomb、wctombランド関数 —
rand、srand時間関数 —
asctime、localtime、gmtime、mktimeその他の関数
atexit、perror、strerror、strtokファイルやヒープを何らかの方法で使用するすべての関数。これには
scanf、sscanf、getchar、getwchar、putchar、およびputwcharが含まれます。‑‑printf_multibytesと‑‑dlib_config=Fullオプションを使用している場合、printfとsprintf関数(または任意の派生型)でもヒープを使用する可能性があります。
errnoを設定できる関数はリエントラントではありません。その理由は、これらの関数のいずれかの結果となるerrnoの値は、読み込まれる前に後続の関数の使用によって上書きされる可能性があるためです。これは、特に数学関数および文字列変換関数に適用します。
以下の解決方法があります。
非リエントラント関数を割り込みサービスルーチンで使用しない
非リエントラント関数の呼び出しをミューテックス、保護エリアなどを利用して保護する