これ以降の関数やマクロに関しては,誌面の都合で検証および詳細な説明は次回に行います.ここでは簡単な説明にとどめておきます.
● マクロDECIMAL_DIG
float.hで宣言されているはずですが,GNU C2.95では存在しません.C99規格で新しく導入されました.
浮動小数点型で表現できる最大の10進桁数が定義されているはずです.
● マクロFLT_EVAL_METHOD
float.hで宣言されているはずですが,GNU C2.95では存在しません.C99規格で新しく導入されました.
浮動小数点演算を行うときの範囲と精度を示す値が定義されているはずです.
● math.hの新しいマクロや関数
C99規格で拡張または追加されたmath.h関連のマクロや関数についてGNU C2.95では,まだ未対応です.
公式ページの情報によるとライブラリに問題があるようです.
● マクロva_copy
va_copyはC99規格で新たに導入されたマクロで,stdarg.hヘッダで定義されています.GNU C2.95でも対応しています.可変長引き数リストのコピーを行うために使用します.
他の環境ではそのまま“va_copy”かもしれませんが,GNU Cでは,_va_copyとして定義されています.
以下の一連の流れをマクロ化したものです.
1)va_startで可変長引き数への参照のためのオブジェクトを初期化
2)va_argで型を指定して可変長引き数を取り出す
3)va_endを使用してオブジェクトを破棄
つまり,va_startでメモリを割り当て,パラメータを格納し,次のパラメータがどれかを指し示すようにします.そしてva_argでリストを順番にたどり,va_endで割り当てたメモリを開放します.
● stdio.hに追加されたいくつかの関数
・snprintf
これは,sprintfに出力文字数を指定できるようにしたものです.宣言は次のとおりです.
int snprintf(char *str, size_t size, const char *format, ...);
・vsnprintf
実際はstdarg.hに追加されたものですが,ここで説明します.
snprintfの可変数引き数の代わりにva_listを用いて呼び出しを行うものです.これらのva_listを使う関数では,va_endマクロは呼び出されません.メモリの解放は使う側の責任です.
宣言は以下のとおりです.
int vsnprintf(char *str, size_t size, const char *format, va_list arg);
・vscanf,vsscanf,vfscanf
va_listを引き数に持つscanf関連の関数です.
int vscanf(const char *format, va_list arg);
int vsscanf(const char *str, const char *format, va_list arg);
int vfscanf(FILE *stream, const char *format, va_list arg);
● stdlibに追加されたいくつかの関数
・_Exit
signalや終了関数を呼び出さずに,プログラムを終了コードstatusですぐに終了させます._exit関数と等価です.
void _Exit(int status);
・strtof,strtold関数
strtofはfloatに,strtoldはlong doubleに対応しています.
float型(strtof),またはlong double型(strtold)を文字列に変換します.
float strtof(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
・strtoll,strtoull関数
見てわかるようにlong long int型を文字列に変換する関数です.
strtoll(const char *nptr, char **endptr, int base);
strtoull(const char *nptr, char **endptr, int base);
・atoll,llabs,lldiv関数
long long int型関係です.
atollは文字列をlong long int型の値として変換します.
long long atoll(const char *nptr);
llabsはlong long int型整数の絶対値を計算します.
long long int llabs(long long int j);
lldivはlong int型の割算の商と余りを計算するものです.
ldiv_t lldiv(long long int numer, long long int denom);
● wchar.hに追加されたいくつかの関数
・vwscanf,vswscanf,vfwscanf
va_listを引き数にもつscanf関係の関数です.
vsscanfなどがワイド文字列に対応しているものです.
int vwscanf(const wchar_t * format, va_list arg);
int vswscanf(const wchar_t * s, const wchar_t * format, va_list arg);
int vfwscanf(FILE *fp, const wchar_t *format, va_list arg);
・wcstof,wcstold
ワイド文字列対応で浮動小数点文字列をfloatやlong doubleに変換するものです.
float wcstof(const wchar_t *restrict p, wchar_t ** endp);
long double wcstold(const wchar_t *restrict p, wchar_t ** endp);
・wcstoll,wcstoull
ワイド文字列対応で文字列をlong long int,unsigned long long intに変換するものです.
long long int wcstoll(const wchar_t * p, wchar_t ** endp, int base);
unsigned long long int wcstoull (const wchar_t * p, wchar_t ** endp, int base);
● wctype.hに追加された関数
・iswblank
isblankのワイド文字列対応版です.結果は表1と同じになるはずです.