1.7.1 C ライブラリを使用しないアプリケーションの作成

アプリケーションが C ライブラリを初期化しない場合、そのアプリケーションでは、多数の関数を使用できません。

main() 関数のあるアプリケーションの作成では、C ライブラリ初期化関数が __rt_lib_init の一部としてインクルードされます。
アプリケーションに main() 関数がない場合、C ライブラリは初期化されません。また、そのアプリケーションでは、以下の関数を使用できません。
  • 接頭文字 _sys_ のある低レベルの stdio 関数
  • signal.h 内のシグナル処理関数 signal() および raise()
  • atexit() などのその他の関数
以下の表では、非初期化ライブラリで利用できるヘッダファイルおよびそのファイルに含まれている関数について説明します。一部の利用不能な関数も、それらが依存しているライブラリ関数を再実装することで利用できるようになります。

表 1-5 スタンドアロン C ライブラリ関数

関数 説明
alloca.h
このファイルの関数は、ライブラリ初期化や関数の再実装をしなくても使用できます。このヘッダファイルを使用するために、C ライブラリでアプリケーションをビルドする方法を知る必要があります。
assert.h
このファイルにリストされている関数は、高レベル stdio、 __rt_raise()、および _sys_exit() 関数を必要とします。このヘッダファイルを使用するには、エラー通知、エラー処理、プログラム終了処理のカスタマイズを熟知している必要があります。
ctype.h
このファイルにリストされている関数は、ロケール関数を必要とします。
errno.h
このファイル内の関数は、ライブラリ初期化や関数の再実装をしなくても使用できます。
fenv.h
このファイルの関数は、ライブラリ初期化をしなくても使用できます。ただし、 __rt_raise() の再実装が必要です。
float.h
このファイルにはコードは含まれていません。このファイル内の定義は、ライブラリ初期化も関数の再実装も必要としません。
inttypes.h
このファイルにリストされている関数は、ロケール関数を必要とします。
limits.h
このファイル内の関数は、ライブラリ初期化や関数の再実装をしなくても使用できます。
locale.h
setlocale() は、ロケール関数を使用する関数を呼び出す前に呼び出します。以下に例を示します。
setlocale(LC_ALL, "C");
以下の関数とデータ構造体の詳細については、 locale.h の内容を参照して下さい。
  • setlocale() は、category および locale 引数によって指定された、適切なロケールを選択します。
  • lconv は、現在のロケールの規則に従って数値形式を設定するためにロケール関数によって使用される構造体です。
  • localeconv() は、lconv 構造体を作成し、この構造体を指すポインタを返します。
  • _get_lconv() は、パラメータによって指定された lconv 構造体に値を設定します。この ISO 拡張では、ライブラリ内部のスタティックデータが不要になります。
locale.h ファイルには、ロケール関数と共に使用される定数宣言も含まれています。
math.h
このファイルの関数を使用するには、まず _fp_init() を呼び出し、__rt_raise() を再実装する必要があります。
setjmp.h
このファイルの関数は、ライブラリ初期化や関数の再実装をしなくても使用できます。
signal.h
このファイルにリストされている関数は、ライブラリ初期化をしないと使用できません。このヘッダファイルを使用するために、C ライブラリでアプリケーションを作成する方法を知る必要があります。
__rt_raise() は、エラーおよび終了処理用に再実装できます。エラー通知、エラー処理、プログラム終了処理のカスタマイズを熟知している必要があります。
stdarg.h
このファイルにリストされている関数は、ライブラリ初期化や関数の再実装をしなくても使用できます。
stddef.h
このファイルにはコードは含まれていません。このファイル内の定義は、ライブラリ初期化も関数の再実装も必要としません。
stdint.h
このファイルにはコードは含まれていません。このファイル内の定義は、ライブラリ初期化も関数の再実装も必要としません。
stdio.h
これらの関数には、以下の依存性または制限が適用されます。
  • printf()scanf()puts()fgets()fread()fwrite()perror() などの高レベル関数は、低レベル stdio 関数の fgetc()fputc()、および __backspace() に依存します。スタンドアロン C ライブラリの使用時には、これらの低レベル関数を再実装する必要があります。
    ただし、先頭に _sys_ が付いた関数(_sys_read() など)は、_sys_ 関数を呼び出す stdio のレイヤがライブラリの初期化を必要とするため、スタンドアロン C ライブラリの使用時には再実装できません。
    C および C++ ライブラリでの入出力関数のカスタマイズを熟知している必要があります。
  • printf() および scanf() ファミリ関数は、ロケールを必要とします。
  • remove() および rename() 関数はシステム固有の関数であるため、ユーザのアプリケーションでは使用できない可能性があります。
stdlib.h
このファイルのほとんどの関数は、ライブラリ初期化または関数の再実装をしなくても使用できます。以下の関数は、適切にインスタンス化されている他の関数に依存します。
  • ato*() はロケールが必要です。
  • strto*() はロケールが必要です。
  • malloc()calloc()realloc()、および free() はヒープ関数が必要です。
  • atexit() は、C ライブラリなしでアプリケーションを作成する場合には利用できません。
string.h
このファイルの関数は、ライブラリ初期化をしなくても使用できます。ただし、ロケールを必要とする strcoll() および strxfrm() を除きます。
time.h
mktime() および localtime() は即座に使用できます。
time() および clock() は、システム固有の関数であるため、再実装しないと使用できない場合があります。
asctime()ctime()、および strftime() はロケールが必要です。
wchar.h
1994 年に『Normative Addendum 1』によって ISO C 標準に追加されたワイドキャラクタライブラリ関数。
これらの関数には、以下の依存性または制限が適用されます。
  • swprintf()vswprintf()swscanf()vswscanf() などの高レベル関数は、fgetwc()fputwc() などの低レベル stdio 関数に依存します。スタンドアロン C ライブラリの使用時には、これらの低レベル関数を再実装する必要があります。詳細については、1.13 C および C++ ライブラリ内での低レベル関数のターゲット依存関係を参照して下さい。
  • swprintf()vswprintf()swscanf()vswscanf() などの高レベル関数はロケールを必要とします。
  • すべての変換関数(btowcwctobmbrtowcwcrtomb など)はロケールを必要とします。
  • wcscoll() および wcsxfrm() はロケールを必要とします。
wctype.h
1994 年に『Normative Addendum 1』によって ISO C 標準に追加されたワイドキャラクタライブラリ関数。このライブラリ関数は、ロケールを必要とします。
関連する概念
1.7.2 C ライブラリを使用せずにベアマシン C としてアプリケーションを作成
1.9 C ライブラリでのロケール関数をカスタマイズするためのアセンブラマクロ
1.7.3 整数および浮動小数点コンパイラ関数と、C ライブラリなしでのアプリケーションのビルド
1.7.8 C ライブラリを使用する場合の高レベル関数の使用
1.7.7 C ライブラリを使用する場合の低レベル関数の使用
関連する参考文書
1.12 C および C++ ライブラリでの入出力関数のカスタマイズ
1.10 エラー通知、エラー処理、プログラム終了処理のための C ライブラリ関数の変更
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.