2.4.4. C ライブラリの利用

main() 関数が含まれているアプリケーションを作成する場合、リンカは、実行環境に必要な初期化コードを自動的にインクルードします。 手順については、C ライブラリを使用したアプリケーションの作成を参照して下さい。 ただし、この方法が不可能であったり、行わないほうがよい場合もあります。

カスタマイズされた起動コードで構成されているにもかかわらず、多くのライブラリ関数を使用するアプリケーションを作成できます。 これには、以下のいずれかを実行する必要があります。

プログラム設計

再実装しなければならない関数は、どの程度のライブラリ機能を必要とするかによって異なります。

  • 除算、構造体コピー、FP 算術演算用のコンパイラサポート関数のみが必要な場合は、__rt_raise() を指定する必要があります。 これにより、errno.h および setjmp.h に含まれている非常に単純なライブラリ関数と、string.h のほとんどの関数も使用できるようになります。

  • setlocale() を明示的に呼び出すと、ロケール依存関数がアクティブになります。 その結果、atoi ファミリ、sprintf()sscanf()ctype.h 内の関数が使用できるようになります。

  • 浮動小数点を使用するプログラムは、_fp_init() を呼び出す必要があります。 ソフトウェア浮動小数点を選択する場合は、プログラムで __rt_fp_status_addr() も指定する必要があります。 この関数が再実装されていない場合、デフォルト動作によって、__user_libspace 領域が作成されます。 __user_libspace 領域については、__user_libspace スタティックデータ領域を参照して下さい。

  • fprintf() または fputs() を使用する関数がある場合、高レベル入出力サポートを実装する必要があります。 高レベル出力関数は、fputc() および ferror() に依存します。 また、高レベル出力関数は、fgetc() および __backspace() に依存します。

これらの関数およびヒープを実装すると、ライブラリのほぼ全体を使用できるようになります。

低レベル関数の使用

main() 関数を持たないアプリケーションでライブラリを使用する場合は、ライブラリ内の一部の関数を再実装する必要があります。 詳細については、スタンドアロン C ライブラリ関数を参照して下さい。

__rt_raise() は基本となる重要な関数です。 この関数は、すべての FP 関数、整数除算(ゼロ除算を通知できるように)、その他のライブラリルーチンによって必要とされます。 __rt_raise() を必要とする処理を実行せずに高度なプログラムを記述することはほとんど不可能です。

Note

rand() を呼び出す場合は、最初に srand() を呼び出す必要があります。 この呼び出しは、ライブラリ初期化時に自動的に行われます。ライブラリ初期化が無効になっているときには行われません。

高レベル関数の使用

例えば、高レベル入出力関数の 1 つである fprintf() は、fputc() のような低レベル関数が再実装されている場合に使用できます。 ほとんどの書式設定された出力関数においても、setlocale() の呼び出しが必要になります。 詳細については、入出力関数のカスタマイズを参照して下さい。

locale を使用するすべての関数は、最初に setlocale() 関数を呼び出して(setlocale(LC_ALL, "C") の呼び出しなど)初期化するまでは呼び出さないようにして下さい。 ロケール使用関数の説明は、スタンドアロン C ライブラリ関数にあります。 ロケール使用関数としては、ctype.hlocale.h にある関数、printf() ファミリ、scanf() ファミリ、ato*strto*strcoll/strxfrm、および time.h のほとんどの関数などが挙げられます。

malloc() の使用

ベアマシン C にヒープサポートが必要な場合、_init_alloc() を最初に呼び出して初期ヒープ上下限を指定する必要があります。また、エラーが返されるだけであっても、__rt_heap_extend() を指定する必要があります。 いずれの関数も、プロトタイプは rt_heap.h にあります。

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential