[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.39 GNU CC が提供するその他の組み込み関数

GNU CC はこれまでに述べた以外にもたくさんの組み込み関数を提供している。 その中の幾つかは内部で使う目的のものがあり、例外や可変長引数リストの 処理に使われる。これらについては、ここでは説明しない。頻繁に 変更が行われるからである。これらの関数を一般的な目的で使用するのは お勧めしない。

その他の関数は、最適化目的で提供されている。

GNU CC には、標準 C ライブラリにある多くの関数の組み込み版が 含まれている。これらは常に、例え ‘-fno-builtin’ オプション (see section C 方言を扱うオプション)を指定した場合でも、C ライブラリの関数と 同じ意味を持つものとして取り扱われる。 これらの関数は、C ライブラリ関数の allocaffsabsfabsffabsfabsllabsmemcpymemcmpstrcmpstrcpystrlensqrtfsqrtsqrtlsinfsinsinlcosfcoscosl に 対応する。

組み込み関数 __builtin_constant_p を使うと、ある値が コンパイル時に定数であったかどうかを知ることができ、そのため、 GNU CC がその値を含む式について定数畳み込みが実行できるかを知ることが できる。この関数の引数がテストすべき値になる。この関数は、引数が コンパイル時定数であることがわかっていた場合には整数 1 を返し、 コンパイル時定数であったことがわからない場合には整数 0 を返す。 0 が返ってきても、その値が定数でなかったということを意味するものではない。 単に GNU CC が、‘-O’ オプションで指定された値では、定数であることが 証明できなかっただけである。

この関数が使われる代表的な場合は、メモリが重要なリソースになる組み込み アプリケーションであろう。何か複雑な形算式があって、それが定数を 含んでいれば定数畳み込みを行って欲しいだろうが、定数を含まない場合は 関数を呼び出す必要がある。例えば、以下のような場合である。

 
#define Scale_Value(X)  \
  (__builtin_constant_p (X) ? ((X) * SCALE + OFFSET) : Scale (X))

この組み込み関数は、マクロやインライン展開関数で使っても良い。 ただし、インライン展開関数の中で使って、その関数に対する引数を 組み込み関数への引数として渡した場合、そのインライン関数の引数に 文字列定数やコンストラクタ式(see section コンストラクタ式)を指定して 呼び出した場合は決して 1 を返さない。また、‘-O’ オプションを 指定しない限り、インライン関数に数値定数を渡したときは 1 を返さない。


This document was generated using texi2html 1.78.