9 ANSI C標準ライブラリ

ANSI C規格は,ANSI Cの処理系で提供される一連の関数とそれに関連する型およびマクロを定義しています。 この章では,すべてのCompaq Cプラットフォームに共通のANSI規格に準拠するライブラリ機能について簡単に説明します。 Compaq Cライブラリ・ルーチンとそのシステム環境での使用, および各オペレーティング・システムで使用可能な追加のヘッダ, 関数,型,およびマクロについての詳細は, 該当するCompaq Cライブラリ・ルーチンのマニュアルを参照してください。

すべてのライブラリ関数はヘッダ・ファイルに宣言されています。 ヘッダ・ファイルの内容をプログラムで使用可能にするには, そのヘッダ・ファイルを #include 前処理命令で取り込みます。次にその例を示します。

     #include <stddef.h>

各ヘッダ・ファイルは一連の関連する関数を宣言し,これらを使用するために必要な型とマクロを定義します。

標準ヘッダは次のとおりです。

ヘッダ・ファイルは,どのような順序でも取り込むことができます。 各ヘッダ・ファイルは所定のスコープ内で複数回取り込むことができ, これは1回取り込んだ場合と同じ結果になります。 ただし,<assert.h> を取り込んだ場合の結果は NDEBUG の定義によって異なります。ヘッダの取込みは外部宣言または定義の外側で, そのヘッダに宣言または定義されている関数,型,またはマクロを参照する前に行います。 識別子が複数の取込みヘッダの中で宣言または定義されている場合, この識別子を含む2番目以降のヘッダはこの識別子への最初の参照の後に取り込むことができます。

9.1 診断メッセージ(<assert.h>)

<assert.h> ヘッダは assert マクロを定義し, 別の場所で定義された別の NDEBUG マクロを参照します。ソース・ファイル内の <assert.h> が取り込まれた場所で NDEBUG がマクロ名として定義されている場合には, assert マクロは次のように定義されます。

     #define assert(ignore) ((void) 0)

マクロ

void assert(int expression);


診断メッセージをプログラムに含める。が偽(0) の場合,assert マクロは失敗した特定の呼出しに関する情報を標準エラー・ ファイルに処理系定義の書式で書き込む。 次に,マクロは abort 関数を呼び出す。assert マクロは値を返さない。

9.2 複素数算術(<complex.h>)

<complex.h> ヘッダ・ファイルは,マクロを定義し, 複素数算術をサポートする関数を宣言しています。

以下の各形式では,関数群を規定しています。 関数群には,主要な関数(1つ以上のdouble complex型のパラメータと, double complexまたはdouble型の返却値を持つ)が1つあります。 また,同じ名前で f および l の接尾語が付いた関数は,パラメータおよび 返却値がfloat型およびlong double型の,対応する関数です。

マクロ

complex

_Complex に展開されます。

_Complex_I

虚数単位の値を持つ,const float _Complex 型の 定数式に展開されます。 虚数単位とは,i2 = -1になる数 i です。

imaginary
_Imaginary_I

処理系が虚数型をサポートしている場合だけ定義されます。 これらのマクロは,定義されている場合,_Imaginary と, 虚数単位の値を持つconst float _Imaginary 型の定数式に 展開されます。

I

_Imaginary_I または _Complex_I に展開されます。 _Imaginary_I が定義されていない場合, I_Complex_I に展開されます。

三角関数

cacos 関数

#include <complex.h>
double complex cacos(double complex z);
float complex cacosf(float complex z);
long double complex cacosl(long double complex z);
cacos 関数は,複素数 z の逆余弦を,分岐線法で 実数軸[-1,+1]の外側を除いて算出します。

cacos 関数は,複素数 z の逆余弦を ラジアン単位の値で返します。 この値は,虚数軸に対しては数学的に無限の範囲にあり, 実数軸では[0,π]の範囲にあります。

casin 関数

#include <complex.h>
double complex casin(double complex z);
float complex casinf(float complex z);
long double complex casinl(long double complex z);
casin 関数は,複素数 z の逆正弦を,分岐線法で 実数軸[-1,+1]の外側を除いて算出します。

casin 関数は,複素数 z の逆正弦を ラジアン単位の値で返します。 この値は,虚数軸に対しては数学的に無限の範囲にあり, 実数軸では[-π/2,+π/2]の範囲にあります。

catan 関数

#include <complex.h>
double complex catan(double complex z);
float complex catanf(float complex z);
long double complex catanl(long double complex z);
catan 関数は,複素数 z の逆正接を,分岐線法で 虚数軸[-i,+i]の外側を除いて算出します。

catan 関数は,複素数 z の逆正接を ラジアン単位の値で返します。 この値は,虚数軸に対しては数学的に無限の範囲にあり, 実数軸では[-π/2,+π/2]の範囲にあります。

ccos 関数

#include <complex.h>
double complex ccos(double complex z);
float complex ccosf(float complex z);
long double complex ccosl(long double complex z);
ccos 関数は,複素数 z の余弦を返します。

csin 関数

#include <complex.h>
double complex csin(double complex z);
float complex csinf(float complex z);
long double complex csinl(long double complex z);
csin 関数は,複素数 z の正弦を返します。

ctan 関数

#include <complex.h>
double complex ctan(double complex z);
float complex ctanf(float complex z);
long double complex ctanl(long double complex z);
ctan 関数は,複素数 z の正接を返します。

双曲線関数

cacosh 関数

#include <complex.h>
double complex cacosh(double complex z);
float complex cacoshf(float complex z);
long double complex cacoshl(long double complex z);
cacosh 関数は,複素数 z の双曲線逆余弦を, 分岐線法で実数軸1未満の値を除いて算出します。

cacosh 関数は,複素数 z の双曲線逆余弦を ラジアン単位の値で返します。 この値は,実数軸の非負側の範囲にあり, 虚数軸では[-iπ,+iπ] の範囲にあります。

casinh 関数

#include <complex.h>
double complex casinh(double complex z);
float complex casinhf(float complex z);
long double complex casinhl(long double complex z);
casinh 関数は,複素数 z の双曲線逆正弦を, 分岐線法で虚数軸[-i,+i]の外側を除いて算出します。

casinh 関数は,複素数の双曲線逆正弦の値を返します。 この値は,実数軸に対しては数学的に無限の範囲にあり, 虚数軸では[-iπ/2,+iπ/2]の範囲にあります。

catanh 関数

#include <complex.h>
double complex catanh(double complex z);
float complex catanhf(float complex z);
long double complex catanhl(long double complex z);
catanh 関数は,複素数 z の双曲線逆正接を, 分岐線法で実数軸[-1,+1]の外側を除いて算出します。

catanh 関数は,複素数の双曲線逆正接の値を返します。 この値は,実数軸に対しては数学的に無限の範囲にあり, 虚数軸では[-iπ/2,+iπ/2]の範囲にあります。

ccosh 関数

#include <complex.h>
double complex ccosh(double complex z);
float complex ccoshf(float complex z);
long double complex ccoshl(long double complex z);
ccosh 関数は,複素数 z の双曲線余弦 を返します。

csinh 関数

#include <complex.h>
double complex csinh(double complex z);
float complex csinhf(float complex z);
long double complex csinhl(long double complex z);
csinh 関数は,複素数 z の双曲線正弦 を返します。

ctanh 関数

#include <complex.h>
double complex ctanh(double complex z);
float complex ctanhf(float complex z);
long double complex ctanhl(long double complex z);
ctanh 関数は,複素数 z の双曲線正接 を返します。

指数関数および自然対数関数

cexp 関数

#include <complex.h>
double complex cexp(double complex z);
float complex cexpf(float complex z);
long double complex cexpl(long double complex z);
cexp 関数は,複素数 z の基数 e の指数 を返します。

clog 関数

#include <complex.h>
double complex clog(double complex z);
float complex clogf(float complex z);
long double complex clogl(long double complex z);
clog 関数は,複素数 z の自然対数 (基数 e) を, 分岐線法で負の実数軸に沿って除外して算出します。

clog 関数は,複素数の自然対数値を返します。 この値は,実数軸に対しては数学的に無限の範囲にあり, 虚数軸では[-iπ,+iπ]の範囲にあります。

累乗関数および絶対値関数

cabs 関数

#include <complex.h>
double cabs(double complex z);
float cabsf(float complex z);
long double cabsl(long double complex z);
cabs 関数は,複素数 z の絶対値 (ノルム,モジュロ,またはマグニチュードともいう)を返します。

cpow 関数

#include <complex.h>
double complex cpow(double complex x, double complex y);
float complex cpowf(float complex x, float complex y);
long double complex cpowl(long double complex x,
                          long double complex y);
cpow 関数は,複素数の累乗関数 xy を, 分岐線法で負の実数軸に沿って1番目のパラメータを除外して算出します。

cpow 関数は,複素数の累乗関数値を返します。

csqrt 関数

#include <complex.h>
double complex csqrt(double complex z);
float complex csqrtf(float complex z);
long double complex csqrtl(long double complex z);
csqrt 関数は,複素数 z の平方根を, 分岐線法で負の実数軸に沿って除外して算出します。

csqrt 関数は複素数の平方根値を返却します。 この値は,複素平面の右半分(虚数軸を含む)の範囲にあります。

操作関数

carg 関数

#include <complex.h>
double carg(double complex z);
float cargf(float complex z);
long double cargl(long double complex z);
carg 関数は,z の偏角 (位相角ともいう) を, 分岐線法で負の実数軸に沿って除外して算出します。

carg 関数は,偏角の値を返します。 この値は,[-π,+π]の範囲にあります。

cimag 関数

#include <complex.h>
double cimag(double complex z);
float cimagf(float complex z);
long double cimagl(long double complex z);
cimag 関数は,z の虚数部を算出し, 実数として返します。

conj 関数

#include <complex.h>
double complex conj(double complex z);
float complex conjf(float complex z);
long double complex conjl(long double complex z);
conj 関数は,複素数 z の共役複素数を, 虚数部の符号を逆にして算出します。

conj 関数は,複素数の共役複素数値を返します。

cproj 関数

#include <complex.h>
double complex cproj(double complex z);
float complex cprojf(float complex z);
long double complex cprojl(long double complex z);
cproj 関数は,z の, リーマン球面への射影を算出します。 すべての複素数の無限大(無限大部が1つとNaN部が1つのものも含む)が 実数軸上の正の無限大に射影するのを除き, zz に射影します。 z に無限大部がある場合,cproj(z) は次の式と同じ になります。
INFINITY + I * copysign(0.0, cimag(z))

cproj 関数は,リーマン球面への射影の値を返します。

creal 関数

#include <complex.h>
double creal(double complex z);
float crealf(float complex z);
long double creall(long double complex z);
creal 関数は,z の実数部を返します。

複素数型の変数 z について, z == creal(z) + cimag(z)*I が成り立ちます。

9.3 文字処理(<ctype.h>)

<ctype.h> ヘッダ・ファイルは,文字を検査するための複数の関数を宣言します。 各関数とも実引数は int であり,値は EOF または unsigned char として表現可能なものでなければなりません。 返却値は整数です。

関数

int isalnum(int c);


この関数へ渡された文字がASCIIの英数字である場合,0以外の整数を返す。 それ以外の場合には,isalnum は0 を返す。

int isalpha(int c);


この関数へ渡された文字がASCIIの英字である場合,0以外の整数を返す。 それ以外の場合には,isalpha は0 を返す。

int iscntrl(int c);


この関数へ渡された文字がASCIIのDEL文字(8進の177,16進の0x7F) または非印字のASCII文字(8進の40,16進の0x20よりも小さいコード) である場合,0以外の整数を返す。それ以外の場合には, iscntrl は0を返す。

int isdigit(int c);


この関数へ渡された文字が10進数字文字(0から9)である場合,0 以外の整数を返す。それ以外の場合には,isdigit は0を返す。

int isgraph(int c);


この関数へ渡された文字がASCIIの図形文字(空白文字以外の印字文字) である場合,0以外の整数を返す。それ以外の場合には, isgraph は0を返す。

int islower(int c);


この関数へ渡された文字がASCIIの英小文字である場合,0以外の整数を返す。 それ以外の場合には,islower は0を返す。

int isprint(int c);


この関数へ渡された文字が空白文字を含むASCIIの印字文字である場合,0 以外の整数を返す。それ以外の場合には, isprint は0を返す。

int ispunct(int c);


この関数へ渡された文字がASCIIの区切り文字(英数字以外の印字文字で8 進の40,16進の0x20よりも大きいコード)である場合,0以外の整数を返す。 それ以外の場合には,ispunct は0を返す。

int isspace(int c);


この関数へ渡された文字が空白である場合,0以外の整数を返す。 それ以外の場合には,isspace は0を返す。 標準空白文字は次のとおり。

int isupper(int c);


この関数へ渡された文字がASCIIの英大文字である場合,0以外の整数を返す。 それ以外の場合には,isupper は0を返す。

int isxdigit(int c);


この関数へ渡された文字が16進数字( 0〜9,A〜F,またはa 〜f )である場合,0以外の整数を返す。それ以外の場合には, isxdigit は0を返す。

int tolower(int c);


大文字を小文字に変換する。c は大文字以外の場合には変更されない。

int toupper(int c);


小文字を大文字に変換する。c は小文字以外の場合には変更されない。

9.4 エラー・コード(<errno.h>)

<errno.h>ヘッダ・ファイルは,エラー報告に使用する複数のマクロを定義します。

マクロ

EDOM
ERANGE


errno に格納できるエラー・コード。これは,0 以外の固有の値を持つ汎整数定数式に展開される。

変数またはマクロ

errno


使用するオペレーティング・システムに応じて, int型で可変左辺値に展開される外部変数またはマクロ。

errno変数は,ライブラリ・ルーチンからの処理系定義のエラー・ コードを保持するために使用する。エラー・コードはすべて正の整数。 errno の値はプログラム開始時には0 だが,ライブラリ関数によって0にセットされることはない。したがって, errno はライブラリ関数を呼び出す前に0 にセットし,その後で検査を行う必要がある。

9.5 ANSI Cの限界(<limits.h>および<float.h>)

<limits.h> および <float.h>ヘッダ・ファイルは,それぞれの処理系固有の限界および仮引数に展開される複数のマクロを定義します。 これらのマクロのほとんどは, ハードウェアの整数および浮動小数点の特性を記述します。 詳細については,プラットフォームに固有のCompaq Cのマニュアルを参照してください。

9.6 ローカル化(<locale.h>)

<locale.h>ヘッダ・ファイルは2つの関数と1つの型を宣言し, 複数のマクロを定義します。

struct lconv


数値の書式化に関連するメンバを含んでいる構造体。この構造体は次のメンバを任意の順序で含む。 それぞれの値をコメント中に示す。
     char *decimal_point;        /*  "."       */
     char *thousands_sep;        /*  ""        */
     char *grouping;             /*  ""        */
     char *int_curr_symbol;      /*  ""        */
     char *currency_symbol;      /*  ""        */
     char *mon_decimal_point;    /*  ""        */
     char *mon_thousands_sep;    /*  ""        */
     char *mon_grouping;         /*  ""        */
     char *positive_sign;        /*  ""        */
     char *negative_sign;        /*  ""        */
     char int_frac_digits;       /*  CHAR_MAX  */
     char frac_digits;           /*  CHAR_MAX  */
     char p_cs_precedes;         /*  CHAR_MAX  */
     char p_sep_by_space;        /*  CHAR_MAX  */
     char n_cs_precedes;         /*  CHAR_MAX  */
     char n_sep_by_space;        /*  CHAR_MAX  */
     char p_sign_posn;           /*  CHAR_MAX  */
     char n_sign_posn;           /*  CHAR_MAX  */

これらのメンバについては,この節の localeconv関数の項で説明します。

マクロ

NULL
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MONETARY
LC_NUMERIC
LC_TIME


それぞれ異なる値で汎整数定数式に展開し, setlocale関数の最初の実引数として使用できる。

関数

char *setlocale(int category, const char *locale);


category および locale実引数によって指定された, プログラムのロケール(地域)の適切な部分を選択する。 この関数は,プログラムの現在のロケール全体またはその一部を変更したり照会する場合に使用できる。

category実引数には次の値を指定できる。

locale実引数には次の値を指定できる。

プログラムの開始処理時に次に示す関数が実行される。

     setlocale(LC_ALL, "C");

setlocale関数は次のいずれか1つを返す。

返される文字列へのポインタはいずれの場合も,後続の呼出しでこの文字列値とその関連カテゴリを使用することによって, プログラムのロケールのその部分がリストアされる。 この文字列をプログラムによって変更することはできないが, 後続の setlocale の呼出しによって重ね書きできる。

struct lconv *localeconv(void);


struct lconv型のオブジェクトの構成要素を,現在のロケールの規則に従って数値を書式化するのに適切な値でセットする。

char*型の構造体メンバは文字列へのポインタであり, decimal_point 以外のいずれのメンバも"" を示すことができる。"" は値の長さが0 であるか,現在のロケールで使用不可能であることを示す。 char型の構造体メンバは非負数であり,そのいずれも CHAR_MAX となって,値が現在のロケールで使用不可能であることを示すことができる。 構造体メンバには次のものがある。


char *decimal_point
非通貨数量の書式化に使用する小数点文字。


char *thousands_sep
書式化された非通貨数量の小数点の前の一連の数字を区切る文字。


char *grouping
各要素が書式化された非通貨数量の一連の数字のサイズを示す文字列。


char *int_curr_symbol
現在のロケールに適用される国際通貨記号。先頭の3文字は, ISO 4217 Codes for the Representation of Currency and Funds の指定に準拠した英字の国際通貨記号を含む。4 番目の文字(ヌル文字の直前)は,国際通貨記号と通貨数量を区切る文字。


char *currency_symbol
現在のロケールに適用する現地通貨記号。


char *mon_decimal_point
通貨数量の書式化に使用する小数点文字。


char *mon_thousands_sep
書式化された通貨数量の小数点の前の一連の数字を区切る文字。


char *mon_grouping
各要素が書式化された通貨数量の一連の数字のサイズを示す文字列。


char *positive_sign
非負数の書式化された通貨数量を示す文字列。


char *negative_sign
負数の書式化された通貨数量を示す文字列。


char int_frac_digits
書式化された国際通貨数量で表示される少数桁の数。


char frac_digits
書式化された通貨数量で表示される少数桁の数。


char p_cs_precedes
currency_symbol が非負数の書式化された通貨数量の値に先行する場合には,1 にセットされる。 currency_symbol がこの値の後に続く場合には,0 にセットされる。


char p_sep_by_space
currency_symbol が非負数の書式化された通貨数量の値から空白で区切られている場合には,1 にセットされる。 空白がない場合には0にセットされる。


char n_cs_precedes
currency_symbol が負数の書式化された通貨数量の値に先行する場合には,1 にセットされる。 currency_symbol がこの値の後に続く場合には0 にセットされる。


char n_sep_by_space
currency_symbol が負数の書式化された通貨数量の値から空白で区切られている場合には,1 にセットされる。 空白がない場合には0にセットされる。


char p_sign_posn
非負数の書式化された通貨数量の positive_sign の位置決めを示す値にセットされる。


char n_sign_posn
負数の書式化された通貨数量の negative_ sign の位置決めを示す値にセットされる。

grouping および mon_ grouping の要素は,次のように解釈される。

p_sign_posn および n_ sign_posn の値は,次のように解釈される。

localeconv関数は構造体の空ではない部分へのポインタを返す。 構造体をプログラムによって変更することはできないが, localeconv または setlocale へのその後の呼出しで LC_ALLLC_ MONETARY,または LC_NUMERIC カテゴリを指定することによって,重ね書きできる。

9.7 算術(<math.h>)

<math.h>ヘッダ・ファイルは,型,マクロと複数の算術関数を定義します。 関数は double実引数を取り, 倍精度値を返します。

このヘッダ中の各関数の動作は,それぞれの入力実引数のすべての表現可能な値に対して定義されます。 各関数は単一演算と同様に実行され,外部的に認識できる例外は生じません。

すべての関数について,算術関数が定義されている定義域の外側に入力実引数がある場合, 定義域エラーが起こります。定義域エラーが起こるかどうかは各関数の説明に記載しています。 定義域エラーが起こると関数は処理系定義の値を返し, EDOM マクロの値が errno に格納されます。

すべての関数について,関数の結果を double値として表現できない場合, 範囲エラーが起こります。 結果がオーバフローした場合(結果が大きすぎて, 指定した型のオブジェクト内で表現できない場合), 関数は関数の正しい値と同じ符号で(tan 関数の場合を除く), HUGE_VALマクロの値を返します。 ERANGEマクロの値が errno に格納されます。結果がアンダフローした場合(結果が小さすぎて, 指定した型のオブジェクト内で表現できない場合),関数は0を返します。 ERANGEマクロの値が errno に格納されるかどうかは,それぞれの処理系定義によって異なります。

マクロ

HUGE_VAL


正の double式に展開する。

INFINITY


可能な場合は, 正または符号なしの無限大を示すfloat型の定数式に展開する。 それ以外では, 変換時にオーバフローになるfloat型の正の定数に展開する。

NAN


Quiet NaNを示すfloat型の定数式に展開する。

三角関数

double acos(double x);


x の逆余弦の値を [0,π] の範囲でラジアン単位で返す。実引数が [-1,+1] の間にない場合,定義域エラーが起こる。

double asin(double x);


x の逆正弦の値を [-π/2,+π/2] の範囲でラジアン単位で返す。実引数が[-1,+1] の間にない場合,定義域エラーが起こる。

double atan(double x);


x の逆正接の値を [-π/2,+π/2] の範囲でラジアン単位で返す。

double atan2(double y, double x);


y/x の逆正接の値をラジアン単位で返し, 両方の実引数の符号を使用して返却値の象限を決める。返される値の範囲は [-π,+π] である。両方の実引数が0の場合, 定義域エラーが起こることがある。

double cos(double x);


x の余弦の値をラジアン単位で返す。

double sin(double x);


x の正弦の値をラジアン単位で返す。

double tan(double x);


x の正接の値をラジアン単位で返す。

双曲線関数

double cosh(double x);


x の双曲線余弦の値を返す。x が大きすぎる場合,範囲エラーが起こる。

double sinh(double x);


x の双曲線正弦の値を返す。x が大きすぎる場合,範囲エラーが起こる。

double tanh(double x);


x の双曲線正接の値を返す。

指数関数と対数関数

double exp(double x);


x の指数関数の値を返す。x が大きすぎる場合,範囲エラーが起こる。

double frexp(double value, int *eptr);


value浮動小数点数を0または [1 /2,1] の間にある正規化した小数部,および2 の汎整数累乗に分割する。この関数は小数部を返し,2 の汎整数累乗は eptr が示す intオブジェクトに格納される。 value が0の場合,結果は両方の部分とも0 になる。

double ldexp(double x, int exp);


浮動小数点数を2の汎整数累乗で乗算し,x x 2[exp] を返す。範囲エラーが起こることがある。

double log(double x);


x の自然対数を返す。実引数が負の場合,定義域エラーが起こる。 実引数が0の場合には,範囲エラーが起こることがある。

double log10(double x);


x の底を10とする対数を返す。x が負の場合,定義域エラーが起こる。x が0の場合には, 範囲エラーが起こることがある。

double modf(double value, double *iptr);


value実引数を整数部と小数部に分割する。いずれの部分も実引数と同じ符号を持つ。 modf関数は符号付き小数部を返し, iptr が示すオブジェクトに double として整数部を格納する。

累乗関数

double pow(double x, double y);


xy を返す。x が負で, y が汎整数値以外の場合,定義域エラーが起こる。 x が0で y が0 以下のときに結果を表現できない場合,定義域エラーが起こる。範囲エラーが起こることがある。

double sqrt(double x);


x の非負数の平方根を返す。x が負の場合,定義域エラーが起こる。

整数の近似値,絶対値,および剰余関数

double ceil(double x);


x 以上の最小の汎整数値を返す。

double fabs(double x);


x浮動小数点数の絶対値を返す。

double floor(double x);


x 以下の最大の汎整数値を返す。

double fmod(double x, double y);


x/y の浮動小数点剰余を計算する。 fmod関数は,i を整数とすると x - i * y を返す。 y が0以外の場合,結果は x と同じ符号になり,大きさは y よりも小さくなる。y が0の場合,関数は0を返す。

9.8 非ローカル飛越し(<setjmp.h>)

<setjmp.h>ヘッダ・ファイルには,通常の関数呼出しと戻りの処理を行わずに, ネストされた関数呼出しから途中で戻ることを可能にする方法を提供する宣言が含まれています。

マクロ

int setjmp(jmp_buf env)


ローカルの jmp_bufバッファを設定し, 飛越しのために初期化する(飛越し自体は longjmp で実行される)。このマクロは,プログラムの呼出し環境を env実引数によって指定された環境バッファに保存し, 後に longjmp関数がこれを使用できるようにする。 setjmp 関数の直接の呼出しの場合,setjmp は0を返す。 longjmp への呼出しからの戻りの場合, setjmp は0以外の値を返す。

jmp_buf


呼出し環境をリストアするために必要な情報を保持するのに適切な配列型。

関数

void longjmp(jmp_buf env, int value);


プログラムの同じ呼出し中に setjmp関数の呼出しによって保存された, env環境バッファのコンテキストをリストアする。 longjmp関数はネストされたシグナル・ ハンドラから呼び出された場合には動作せず,その動作結果は定義されていない。

valueによって指定された値は,longjmp から setjmp へ渡される。 longjmp の完了後,それに対応する setjmp の呼出しによって value が返された場合と同様に,プログラムは続行する。 value が0として setjmp に渡された場合には,1に変換される。

9.9 シグナル処理(<signal.h>)

<signal.h>ヘッダ・ファイルは1つの型と2つの関数を宣言し, プログラム実行中に報告される可能性がある例外条件を処理するための複数のマクロを定義します。

sig_atomic_t


非同期割込みがあった場合でも,アトミック要素としてアクセスできるオブジェクトの汎整数型。

マクロ

SIG_DFL
SIG_ERR
SIG_IGN


signal関数の第2実引数,およびこの関数の返却値と互換性がある型を持つ値の定数式にそれぞれ展開する。 この値は, 宣言可能な関数のアドレスとは等しくない。

関数

void (*signal(int sig, void (*handler) (int))) (int);


後続のシグナルの処理方法を決める。シグナルは次のように処理される。

  1. handler の値が SIG_DFL の場合,そのシグナルの省略時の処理が起こる。

  2. handler の値が SIG_IGN の場合,シグナルは無視される。

  3. 前記以外の場合にこのシグナルが発生すると, handler が示す関数がシグナルの型の実引数で呼び出される。 このような関数をシグナル・ハンドラ と呼ぶ。有効なシグナルは次のとおり。

    • SIGABRT -異常終了。たとえば,abort関数。

    • SIGFPE -算術エラー。たとえば,0除算またはオーバフロー。

    • SIGILL -無効な関数イメージ。たとえば,無効な命令。

    • SIGINT -対話型介入。たとえば,割込み。

    • SIGSEGV -記憶域への無効なアクセス。たとえば,メモリ限界の外側へのアクセス。

    • SIGTERM -プログラムへ送られる終了要求。

その他のシグナルは,各オペレーティング・システムに依存する。

要求が受け入れられた場合,signal関数は指定した sigシグナルに対する signal への最新の呼出しに対して handler の値を返す。要求が受け入れられなかった場合には, SIG_ERR の値が返され,処理系定義の正の値が errno に格納されます。

int raise(int sig);


sig シグナルを実行プログラムに送る。 raise関数は成功した場合には0を返し,成功しなかった場合には0 以外の値を返す。

9.10 可変個実引数(<stdarg.h>)

<stdarg.h>ヘッダ・ファイルは1つの型を宣言し,3つのマクロを定義して, 可変個の数と型を持つ関数の実引数並びの処理を行います。

va_list


va_startva_arg,および va_endマクロが必要とする情報を保持するのに適切な型。

可変個の実引数にアクセスするには,呼び出された関数は va_list型のオブジェクトを宣言しなければならない。 次の例では,apがオブジェクト。

     va_list ap;

apオブジェクトは,実引数として別の関数に渡すことができる。 その関数が ap仮引数で va_argマクロを呼び出した場合, 呼出し関数の中の ap の値は不定になり, ap への次の参照を行う前に va_endマクロへ渡される。

マクロ

void va_start(va_list apparmN);


ap を初期化し,それ以後に va_arg および va_ end が使用できるようにする。未指名の実引数にアクセスする前には, va_startマクロを呼び出さなければならない。

parmN仮引数は,関数定義の可変個仮引数並び中の右端の仮引数の識別子。 parmN register記憶域クラス, 関数型または配列型,あるいは省略時の実引数拡張の適用後に生じる型と互換性を持たない型で宣言した場合の動作結果は定義されていない。 va_startマクロは値を返さない。

type va_arg(va_list ap, type);


呼出し中の次の実引数の型と値を持つ式に展開する。 ap仮引数は va_start によって初期化された va_list ap と同じ。va_arg を呼び出すたびに ap が変更され,連続する実引数の値が順に返される。 type仮引数は指定された型名であり,type の後にアスタリスク( * )を付けることによって, 指定した型のオブジェクトへのポインタの型を取得することができる。 次の実引数がない場合,または type が(省略時の実引数拡張によって拡張された)次の実引数の型と互換性を持たない場合の動作結果は定義されていない。

va_start の呼出しの後に初めて va_arg を呼び出すと,parmN によって指定された後の実引数の値を返す。連続して呼び出すと, 残りの実引数の値を順に返す。

void va_end(va_list ap);


va_list apオブジェクトを初期化した va_start の展開によって可変個実引数並びが参照された関数から通常の返却値を返す。 va_endマクロは ap を変更して,(va_ start の呼出しなしには)使用できないようにすることができる。 対応する va_start が呼び出されなかった場合,または戻る前に va_ end が呼び出されなかった場合の動作結果は定義されていない。 va_endマクロは値を返さない。

9.11 ブール型とブール値(<stdbool.h>)

<stdbool.h>ヘッダ・ファイルは, マクロを4つ定義しています。

マクロ

bool

_Boolに展開されます。

true
false
__bool_true_false_are_defined

#if前処理命令内で使用するのに適しています。

trueは,整数定数1に展開されます。

falseは,整数定数0に展開されます。

__bool_true_false_are_definedは,整数定数1に展開されます。

9.12 共通定義(<stddef.h>)

<stddef.h>ヘッダ・ファイルは複数の型とマクロを定義し, そのいくつかは他のヘッダ・ファイルにも定義されています。

ptrdiff


2つのポインタの差を表す符号付き汎整数型。

size_t


sizeof演算子の結果を表す符号なし汎整数型。

wchar_t


汎整数型。値の範囲は,サポートされるロケールに指定された最大の拡張文字集合のすべてのメンバを個別のコードで表すことができる。

マクロ

NULL


処理系定義の空ポインタ定数に展開する。

offsetof(type, member-designator)


値を(type で指定した)構造体の先頭から( member-designator で指定した) 構造体メンバへのバイト単位のオフセットとして size_t型の汎整数定数式に展開する。member- designator は,次に示すような式 &(t.member-designator) をアドレス定数として評価される。
     static type t;

指定したメンバがビット・フィールドの場合の動作結果は定義されていない。

9.13 標準入出力(<stdio.h>)

<stdio.h>ヘッダ・ファイルは,テキストの入出力を行うための3 つの型,複数のマクロ,および多数の関数を宣言します。テキスト・ ストリームは一連の行からなり,各行は改行文字で終わります。

size_t


sizeof演算子の結果の符号なし汎整数型。

FILE


データ・ストリームの制御に必要なすべての情報を記録することができるオブジェクト型。 これは,ファイル位置指示子,その関連バッファ( 存在する場合)へのポインタ,読込み/書込みエラーが起きたかどうかを記録する エラー指示子,およびファイルの終わりに達したかどうかを記録する ファイル終了指示子を含む。

fpos_t


ファイル内の各位置を個別に指定するために必要なすべての情報を記録できるオブジェクト。

マクロ

NULL


処理系定義の空ポインタ定数に展開する。

_IOFBF
_IOLBF
_IONBF


setvbuf関数の第3実引数として使用するために,適切なそれぞれの値の汎整数定数式に展開する。

BUFFSIZ


汎整数定数式に展開する。この式は,setbuf関数が使用するバッファのサイズ。

EOF


負の汎整数定数式に展開する。これは,多数の関数がファイルの終わりを示すために返す。

FOPEN_MAX


汎整数定数式に展開する。これは,Compaq Cコンパイラが各システムに対して, 同時にオープンできることを保証するファイルの最大数。

FILENAME_MAX


汎整数定数式に展開する。これは,Compaq Cコンパイラが各システムでオープンできる最長のファイル名文字列を char の配列で保持するのに必要なサイズ。

L_tmpnam


汎整数定数式に展開する。これは,tmpnam関数によって作成された一時的ファイル名の文字列を char の配列で保持するのに必要なサイズ。

SEEK_CUR
SEEK_END
SEEK_SET


fseek関数の第3実引数として使用するために,適切なそれぞれの値の汎整数定数式に展開する。

TMP_MAX


tmpnam関数が生成できる固有のファイル名の最大数である汎整数定数式に展開する。

stderr
stdin
stdout


標準エラー,入力および出力ストリームに関連する FILEオブジェクトをそれぞれ示す FILE へのポインタ型の式。

ファイル操作関数

int remove(const char *filename);


filename が示す名前を持つファイルを, この名前でアクセスできないようにする。これ以降この名前でこのファイルをオープンしようとすると失敗する。 remove関数は操作が成功した場合には0を返し,失敗した場合には0 以外を返す。ファイルがオープンされた場合,この関数の動作は各処理系定義により異なる。

int rename(const char *old, const char *new);


ファイルの名前を,old が示す名前から new が示す名前に変更する。 このファイルは,古いファイル名ではアクセス不可能になる。 rename関数は操作が成功した場合には0を返し, 失敗した場合には0以外を返す。ただし,失敗した場合でそのファイルが存在している場合には, 元の名前のままで識別される。 rename を呼び出す前に新しいファイルが存在している場合には, この関数の動作は各処理系定義により異なる。

FILE *tmpfile(void);


ファイルのクローズ時やプログラム実行の終了時に自動的に削除される一時的バイナリ・ ファイルを作成する。実行が異常終了した場合には, オープンしているその一時的ファイルを削除するかどうかは各処理系によって異なる。 更新のため,ファイルのオープンは wb+モードで行われる( 表 9-1を参照のこと) 。tmpfile関数は作成したファイルのストリームへのポインタを返す。 ファイルを作成できない場合には, tmpfile は空ポインタを返す。

FILE *tmpnam(void);


既存のファイルの名前とは異なる有効なファイル名を作成する。 tmpnam の呼出しを最高で TMP_MAX回まで行うたびに,異なる名前が作成される。 tmpnam の呼出しを TMP_MAX回よりも多く行った場合の動作は,各処理系定義により異なる。

実引数が空ポインタの場合には,tmpnam関数はその結果を内部の静的オブジェクトに残し, このオブジェクトへのポインタを返す。 これ以降の tmpnam の呼出しで,この同じオブジェクトを変更することができる。実引数が空ポインタではない場合には, 少なくとも L_ tmpnam chars の配列へのポインタとみなされる。 tmpnam関数はその結果をこの配列へ書き込み,実引数をその値として返す。

ファイル・アクセス関数

int fclose(FILE *stream);


stream が示すストリームをフラッシュし, 関連ファイルをクローズする。そのストリームの未書込みのバッファ内に格納されているデータは, ホスト環境へ転送され,ファイルへ書き込まれる。 未読込みのバッファ内に格納されているデータは破棄される。 ストリームとファイルとの関連が解除される。 関連バッファが自動的に割り当てられていた場合,この割当ては解除される。 fclose関数はストリームのクローズが成功した場合には0 を返し,エラーが検出された場合には EOF を返す。

int fflush(FILE *stream);


stream が出力ストリームまたは更新ストリーム( 最新の操作が入力ではない)を示す場合, fflush関数はまだ書き込んでいないデータをホスト環境に転送し, ファイルに書き込む。それ以外の場合の動作結果は定義されていない。 stream が空ポインタの場合には,fflush は出力ストリームまたは更新ストリーム( 最新の操作が入力ではない)のすべてをフラッシュする。 fflush関数は操作が成功した場合は0 を返し,書込みエラーが起きた場合は EOF を返す。

FILE *fopen(const char *filename, const char *mode);


filename が示すファイルをオープンし,そのファイルにストリームを関連付ける。 mode実引数は,表 9-1 に示した文字列の1つで始まる文字列を示す。 これらの文字列には追加の文字が続くことがある。

表 9-1 ファイル・モード

モード 説明
r 読込みのためにテキスト・ファイルをオープンする。
w 長さ0に切り捨てるか,または書込みのためにテキスト・ ファイルを作成する。
a 追加。ファイルの終わりに書き込むためにテキスト・ ファイルをオープンまたは作成する。
rb 読込みのためにバイナリ・ファイルをオープンする。
wb 長さ0に切り捨てるか, または書込みのためにバイナリ・ファイルを作成する。
ab 追加。ファイルの終わりに書き込むためにバイナリ・ファイルをオープンまたは作成する。
r+ 更新(読込みおよび書込み) のためにテキスト・ファイルをオープンする。
w+ 長さ0に切り捨てるか, または更新のためにテキスト・ファイルを作成する。
a+ 追加。更新とファイルの終わりに書き込むためにテキスト・ ファイルをオープンまたは作成する。
r+b または rb+ 更新(読込みおよび書込み)のためにバイナリ・ ファイルをオープンする。
w+b または wb+ 長さ0 に切り捨てるか,または更新のためにバイナリ・ファイルを作成する。
a+b または ab+ 追加。更新とファイルの終わりに書き込むためにバイナリ・ ファイルをオープンまたは作成する。

fopen関数はストリームを制御するオブジェクトへのポインタを返す。 オープン操作が失敗した場合,fopen は空ポインタを返す。

FILE *freopen(const char *filename, const char *mode, FILE *stream);


filename が示すファイルをオープンして, stream が示すストリームをこのファイルに関連付ける。 mode実引数は,fopen関数と同様に使用される。 freopen 関数は最初に,指定したストリームに関連するファイルをクローズしようとする。 ファイルのクローズが成功しなかった場合には無視される。 ストリームに関するエラーおよびファイル終了指示子がリセットされる。

freopen は主に,標準テキスト・ストリーム( stderrstdin,または stdout ) に関連するファイルを変更する際に使用する。これは, fopen関数により返される値を代入できる可変左辺値をこれらの指示子が必要としないからである。

freopen関数はストリームを制御するオブジェクトへのポインタを返す。 オープン操作が失敗した場合, freopen は空ポインタを返す。

void setbuf(FILE *stream, char *buf);


値を返さない点を除き,setbuf関数は setvbuf関数と同じ。setvbuf関数は, mode _IOFBF で,size BUFSIZ で,mode _IONBF の場合(buf が空ポインタの場合)に呼び出される関数である。

int setvbuf(FILE *stream, char *buf, int mode size_t size);


バッファを入力または出力ファイルに関連付ける。 setvbuf関数は,stream が示すストリームがオープンしたファイルに関連付けられた後で, その他の操作をストリーム上で実行する前に実行することができる。 mode実引数は, stream をバッファ内に格納する方法を決定する。

buf が空ポインタ以外の場合は setvbuf関数で割り当てたバッファの代わりに,示される配列を使用することができる。 配列のサイズは size で指定する。ある時点での配列の内容は不定である。 setvbuf関数は成功した場合には0を返し, mode に無効な値を指定した場合,または要求を受け入れることができない場合には0 以外の値を返す。

書式付き入出力関数

int fprintf(FILE *stream, const char *format, ...);


format (書式)が示す文字列の制御に基づき, stream が示すストリームへ出力を書き込む。 書式は後続の実引数が出力用に変換される方法を指定する。実引数の数が書式より少ない場合の動作結果は定義されていない。 書式をすべて使用しても実引数が残っている場合には余分な実引数は評価されるが, その他の点では無視される。fprintf関数は書式文字列の終わりに達すると戻る。 fprintf 関数は転送された文字の数を返し,出力エラーが起きた場合は負の値を返す。

詳細については,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

int fscanf(FILE *stream, const char *format,...);


format が示す文字列の制御に基づき, stream が示すストリームから入力を読み込む。 書式は,入力可能なシーケンスと,これらのシーケンスが代入のために変換される方法を指定し, 後続の実引数をオブジェクトへのポインタとして使用して, 変換された入力を受け取る。実引数の数が書式より少ない場合の動作結果は定義されていない。 書式をすべて使用しても実引数が残っている場合には余分な実引数は評価されるが, その他の点では無視される。

fscanf関数は,変換の前に入力の失敗が起こった場合に EOFマクロの値を返す。それ以外の場合には, fscanf は代入した入力項目の数を返す。 この数は入力された数より少ないことがあり,一致しない場合には0 になることもある。

詳細については,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

int printf(const char *format, ...);


printf が標準出力ストリーム( stdout )に書式付き出力を書き込む点を除き, fprintf関数と等価である。

int scanf(const char *format, ...);


scanfが標準入力ストリーム( stdin )から書式付き入力を読み込む点を除き, fscanf関数と等価である。

int sprintf(char *s, const char *format, ...);


s実引数が,生成する出力の書込み先としてストリームではなく配列を指定する点を除き, fprintf関数と等価である。 書き込まれた文字の終わりにはヌル文字が書き込まれる。重複するオブジェクト間でコピーが行われた場合の動作は定義されていない。 sprintf関数は配列へ書き込まれた文字の数を返す。 終了ヌル文字はカウントされない。

int sscanf(const char *s, const char *format, ...);


s実引数が,ストリームではなく配列から入力を読み込むことを指定する点を除き, fscanf関数と等価である。文字列の終わりに達することは, fscanf関数がファイルの終わりに達することと同じことを示す。 重複するオブジェクト間でコピーが行われた場合の動作結果は定義されていない。

#include <stdarg.h>
int vfprintf(FILE *stream, const char *format, va_list arg);


fprintf関数と等価ですが,arg に置き換えられた可変個の実引数並びは, va_startマクロ(および場合により後続の va_arg 呼出し)によって初期化されていなければならない。 vfprintf関数は va_endマクロを呼び出さない。

#include <stdarg.h>
int vprintf(const char *format, va_list arg);


printf関数と等価ですが,arg に置き換えられた可変個の実引数並びは, va_startマクロ(および場合により後続の va_arg 呼出し)によって初期化されていなければならない。 vprintf関数は va_endマクロを呼び出さない。

#include <stdarg.h>
int vsprintf(char *s, const char *format, va_ list arg);


sprintf関数と等価ですが,arg に置き換えられた可変個の実引数並びは, va_startマクロ(および場合により後続の va_arg 呼出し)によって初期化されていなければならない。 vsprintf関数は va_endマクロを呼び出さない。

文字入出力関数

int fgetc(FILE *stream);


次の文字(存在する場合)を,stream が示す入力ストリームから int へ変換された unsigned char として返し,ストリームの関連するファイル位置指示子( 定義されている場合)を進める。 ストリームがファイルの終わりである場合にはストリームのファイル終了指示子がセットされ, fgetc EOF を返す。読込みエラーが起きた場合はエラー指示子がセットされ, fgetc EOF を返す。

char *fgets(char *s, int n, FILE *stream);


stream が示すストリームから,n で指定した文字数よりも1つ以上少ない文字数を,s が示す配列へ読み込む。改行文字(これは保存される)を読み込んだ後, またはファイルの終わりに達した後には,追加の文字の読込みはない。 配列へ読み込まれた最後の文字の直後にヌル文字が書き込まれない。

成功した場合,fgets関数は s を返す。ファイルの終わりに達し,文字が配列へ読み込まれなかった場合には配列の内容は変更されず, 空ポインタが返される。操作中に読込みエラーが起きた場合は配列の内容は不定になり, 空ポインタが返される。

int fputc(int c, FILE *stream);


文字 c (unsigned char へ変換される)を,stream が示す出力ストリームに関連するファイル位置指示子( 定義されている場合)が指示する位置に書き込み, 必要に応じて指示子を進める。ファイルが位置決め要求をサポートできない場合, またはストリームが追加モードでオープンされた場合には, 出力ストリームへ文字が追加される。 fputc関数は書き込まれた文字を返す。 書込みエラーが起きた場合はストリームのエラー指示子がセットされ, fputc EOF を返す。

int fputs(const char *s, FILE *stream);


s が示す文字列を stream が示すストリームへ書き込む。終了ヌル文字は書き込まれない。

書込みエラーが起きた場合,fputs関数は EOF を返し,それ以外の場合は負以外の値を返す。

int getc(FILE *stream);


マクロとして実現されている場合,stream を複数回評価される可能性がある点を除き, fgetc関数と等価である。 このため,実引数は副作用がある式であってはならない。

int getchar(void);


stdin実引数を持つ getc関数と等価である。

char *gets(char *s);


stdin が示す入力ストリームから s が示す配列へ,ファイルの終わりに達するか改行文字が読み込まれるまで文字を読み込む。 改行文字は破棄され, 配列へ読み込まれた最後の文字の直後にヌル文字が書き込まれる。

成功した場合,fgets関数は s を返す。ファイルの終わりに達し,文字が配列へ読み込まれなかった場合には配列の内容は変更されず, 空ポインタが返される。操作中に読込みエラーが起きた場合は配列の内容は不定になり, 空ポインタが返される。

int putc(int c, FILE *stream);


マクロとして実現されている場合,stream を複数回評価される可能性がある点を除き, fputc関数と等価である。 このため,実引数は副作用がある式であってはならない。

int putchar(int c);


stdout第2実引数を持つ putc関数と等価である。

int puts(const char s);


s が示す文字列を stdout が示すストリームへ書き込み, 出力に改行文字を追加する。終了ヌル文字は書き込まれない。 書込みエラーが起きた場合,puts関数は EOF を返し,それ以外の場合には負以外の値を返す。

int ungetc(int c, FILE *stream);


文字 c (unsigned char に変換される)を,stream が示す入力ストリームへプッシュ・ バックし,ストリームをその文字の前の位置のままにしておく。 プッシュ・バックされた文字は,このストリーム上の次の読込みによって, プッシュ・バックされたのとは逆順で返される。 このストリームに対するファイル位置決め関数( fseekfsetpos,または rewind )の呼出しに成功すると,プッシュ・バックされた文字は破棄される。

ファイル上に前の処理が存在しない場合でも,1回のプッシュ・バックが保証される。 ungetc関数は変換済みのプッシュ・バックされた文字を返すか, または操作が失敗した場合には EOF を返す。

直接入出力関数

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);


stream が示すストリームから, サイズが size の要素を最大で nmemb個まで ptr が示す配列へ読み込む。ストリームのファイル位置指示子( 定義されている場合)は,読込みに成功した文字数だけ進む。 エラーが生じた場合,ストリームのファイル位置指示子の値は不定になる。 要素の一部が読み込まれた場合,その値は不定になる。

fread関数は読込みに成功した要素の数を返すが, 読込みエラーまたはファイルの終わりを検出した場合は nmemb より少なくなる。size または nmemb が0の場合には fread は0を返し,配列の内容とストリームの状態は変更されない。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);


ptr が示す配列から,サイズが size の要素を最大で nmemb個まで, stream が示すストリームへ書き込む。ストリームのファイル位置指示子( 定義されている場合)は,書込みに成功した文字数だけ進む。 エラーが生じた場合,ストリームのファイル位置指示子の値は不定になる。

fwrite関数は書込みに成功した要素の数を返すが,書込みエラーが見つかった場合にのみ nmemb より少なくなる。

ファイル位置決め関数

int fgetpos(FILE *stream, fpos_t *pos);


stream が示すストリームのファイル位置指示子の現在値を, pos が示すオブジェクトへ格納する。 その値には未指定の情報も含まれており, それは fgetpos 関数を呼び出したときに,fsetpos関数がストリームをその位置に返すために使用する。

成功した場合,fgetpos関数は0を返す。失敗した場合, fgetpos は0以外を返し,処理系定義の正の値を errno に格納する。

int fseek(FILE *stream, long int offset, int whence);


ファイル位置指示子を,stream が示すストリーム内の指定されたバイト・ オフセットにセットする。

バイナリ・ストリームの場合,ファイルの先頭からの文字数で新しい位置を取得するには offset whence で指定する位置に追加する。この位置は次のいずれかである。

テキスト・ストリームの場合,offset は0になるか,または同じストリームに対する ftell関数への以前の呼出しによって返された値になる。 whence SEEK_SET になる。

fseek への呼出しが成功すると,ストリームのファイル終了指示子はリセットされ, 同じストリーム上での ungetc関数の効果は取り消される。 fseek を呼び出した後,更新ストリーム上での次の操作は入力または出力になる。 要求を満足させることができない場合にのみ, fseek関数は0以外の値を返す。

int fsetpos(FILE *stream, const fpos_t *pos);


pos が示すオブジェクトの値に従って, stream が示すストリームのファイル位置指示子をセットする。 このオブジェクト値は,同じストリーム上での fgetpos 関数への以前の呼出しから得られる。

fsetpos への呼出しが成功するとストリームのファイル終了指示子はリセットされ, 同じストリーム上での ungetc関数の効果は取り消される。 fsetpos を呼び出した後,更新ストリーム上での次の操作は入力または出力になる。

成功した場合,fsetpos関数は0を返す。失敗した場合, fsetpos は0以外を返し,処理系定義の正の値を errno に格納する。

long int ftell(FILE *stream);


stream が示すストリームのファイル位置指示子の現在値を取得する。 バイナリ・ストリームの場合,値はファイルの先頭からの文字数である。 テキスト・ストリームの場合,そのファイル位置指示子には未指定の情報も含まれており, それは ftell関数を呼び出したときに,fseek関数がストリームのファイル位置指示子をその位置に返すために使用する。 この2つの返却値の差は,必ずしも書込みまたは読込みが行われた文字数の意味ある尺度ではない。

成功した場合,ftell関数はストリームのファイル位置指示子の現在値を返す。 失敗した場合,ftell は-1Lを返し,処理系定義の正の値を errno に格納する。

void rewind(FILE *stream);


stream が示すストリームのファイル位置指示子をファイルの先頭にセットする。 ストリームのエラー指示子もリセットされる点を除き, 次の関数と等価である。
     (void)fseek(stream, 0L, SEEK_SET)

rewind関数は値を返さない。

エラー処理関数

void clearerr(FILE *stream);


stream が示すストリームのファイル終了指示子とエラー指示子をリセットする。 clearerr関数は値を返さない。

int feof(FILE *stream);


stream が示すストリームのファイル終了指示子を検査する。 feof関数はファイル終了指示子が stream に対してセットされた場合にのみ,0 以外の値を返す。

int ferror(FILE *stream);


stream が示すストリームのファイル終了指示子を検査する。 ファイル終了指示子が stream に対してセットされた場合にのみ,ferror関数は0 以外の値を返す。

void perror(const char *s);


errno整数式のエラー番号をエラー・メッセージにマップする。 次に示す文字列を標準エラー・ストリームへ書き込む。

  1. s が示す文字列とその後にコロン( : )と空白(s が空ポインタでなく, s が示す文字がヌル文字以外の場合)

  2. 適切なエラー・メッセージ文字列と改行文字

エラー・メッセージ文字列の内容は errno実引数を持つ strerror関数が返すものと同じであり, 処理系定義である。perror関数は値を返さない。

9.14 汎用ユーティリティ(<stdlib.h>)

<stdlib.h>ヘッダ・ファイルは汎用の4つの型と複数の関数を宣言し, 複数のマクロを定義します。関数は文字列変換,乱数生成,検索とソート, メモリ管理,およびそれに類似したタスクを実行します。

size_t


sizeof演算子の結果の符号なし汎整数型。

wchar_t


サポートされるロケール間で指定されている最大拡張文字集合のすべてのメンバに対して, 個別のコードで表すことができる値の範囲を持つ汎整数型。

div_t


div関数によって返される値の型である構造体型。

ldiv_t


ldiv関数によって返される値の型である構造体型。

マクロ

NULL


処理系定義の空ポインタ定数に展開する。

EXIT_FAILURE /EXIT_SUCCESS


exit関数の実引数として使用して,それぞれ不成功または成功の終了状態をホスト環境に返すための汎整数式に展開する。 これらのマクロは,main関数からの返却値としても有用である。

RAND_MAX


rand関数から返される最大値を持つ汎整数定数式に展開する。

MB_CUR_MAX


現在のロケール(LC_TYPE カテゴリ)で指定されている拡張文字集合の多バイト文字中の最大バイト数の値を持つ正の汎整数式に展開する。 この値は,常に MB_LEN_MAX 以下である。

文字列変換関数

double atof(const char *nptr);


nptr が示す文字列を double表現に変換し,変換された値を返す。エラー発生時の動作を除き, この関数は次に示すものと等価である。
     strtod(nptr, (char **)NULL)

int atoi(const char *nptr);


nptr が示す文字列を int表現に変換し,変換された値を返す。エラー発生時の動作を除き, この関数は次に示すものと等価である。
     (int)strtol(nptr, (char **)NULL, 10)

long int atol(const char *nptr);


nptr が示す文字列を long int表現に変換し,変換された値を返す。エラー発生時の動作を除き, この関数は次に示すものと等価である。
     strtol(nptr, (char **)NULL, 10)

double strtod(const char *nptr, char **endptr);


nptr が示す文字列を double表現に変換する。

この関数についての詳細は,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

long int strtol(const char *nptr, char **endptr, int base);


nptr が示す文字列を long int表現に変換する。

この関数についての詳細は,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

unsigned long int strtoul(const char *nptr, char **endptr, int base);


nptr が示す文字列を unsigned long int 表現に変換する。

この関数についての詳細は,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

擬似乱数列発生関数

int rand(void);


擬似乱整数列を0から RAND_MAX の範囲で返す。

void srand(unsigned int seed);


実引数を,後続の rand 呼出しによって返される新しい擬似乱整数列のシードとして使用する。 その後に srand が同じシード値で呼び出された場合には, 同じ擬似乱整数列が繰り返される。 srand への呼出しを行う前に rand が呼び出された場合,生成される列は srand をシード値1で最初に呼び出したときと同じ。 srand関数は値を返さない。

メモリ管理関数

void *calloc(size_t nmemb, size_t size);


nmemb項目の配列に対して,それぞれサイズが size でメモリ領域を割り当てる。領域はすべてビット0 に初期化される。割当て不可能であった場合, calloc関数は空ポインタを返し,それ以外の場合には割り当てた領域へのポインタを返す。

void free(void *ptr);


ptr が示すメモリ領域の割当てを解除する。これは callocmalloc,または realloc によって以前に割り当てられたメモリ領域である。 ptr が空の場合には割当ての解除は行われない。 値も返されない。

void *malloc(size_t size);


サイズが size のオブジェクトに対して, メモリの連続領域を割り当てる。領域は初期化されない。この関数は割り当てた領域へポインタを返すが, 割当て不可能の場合は空ポインタを返す。

void *realloc(void *ptr, size_t size);


ptr が示す領域のサイズを size で指定されたバイト数に変更する。 ptr が空の場合,realloc の動作は malloc と同一になる。 領域の内容は,旧サイズと新サイズのいずれか小さいサイズまでは変更されない。 サイズ変更できなかった場合,この関数は空ポインタを返し, それ以外の場合には移送した再割当て済みの領域へのポインタを返す。

環境との連絡

void abort(void);


SIGABRTシグナルが見つかり,シグナル・ ハンドラが返らない限りプログラムの異常終了が起こる。 abort関数は呼び出す側に値を返すことはできない。

int atexit(void (*func)(void));


func が示す関数が,プログラムの正常終了時に実引数なしで呼び出されるように登録する。 最大で32 個までの関数を登録できる。登録が成功した場合, atexit関数は0を返す。それ以外の場合は0以外を返す。

void exit(int status);


プログラムの正常終了が起こる。プログラムが exit の呼出しを複数回実行した場合の動作結果は定義されていない。 実行時には次のことが起こる。

  1. atexit によって登録されたすべての関数が, 登録と逆順で呼び出される。

  2. オープンしているすべての出力ストリームがフラッシュされ, オープンしているすべてのストリームがクローズされ, tmpfile によって作成されたすべてのファイルが削除される。

  3. 制御がホスト環境へ戻される。status の値は errno値に対応する。

    • status値が0または EXIT_ SUCCESS の場合は,成功終了状態が返される。

    • status値が EXIT_ FAILURE の場合は,不成功終了状態が返される。

    • それ以外の場合には,不成功終了状態が返される。

char *getenv(const char *name);


ホスト環境によって提供された環境並びを検索する。

この関数についての詳細は,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

int *system(const char *string);


string が示す文字列を,コマンド・プロセッサによる実行のためにホスト環境に引き渡す。 空ポインタを指定すると, コマンド・プロセッサが存在するかどうかを問い合わせることができる。 実引数が空ポインタの場合,system関数はコマンド・ プロセッサが使用可能であれば0以外を返し,使用可能でなければ0 を返す。実引数が空ポインタ以外の場合,返却値はコマンド・プロセッサが返した状態になり, コマンド・プロセッサが使用可能ではない場合には0 になる。

この関数についての詳細は,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

検索およびソート・ユーティリティ

     void *bsearch(const void *key, const void *base,
       size_t nmemb, size_t size, int (*compar)
       (const void *, const void *));

nmembオブジェクトの配列を検索して,keyが示すオブジェクトと一致する要素を求める。 配列の先頭要素は base が示す。各要素のサイズは size によって指定される。

ユーザは最初に,compar が示す関数に従って配列を昇順にソートしなければならない。 bsearch関数は compar が示す指定の比較関数を,比較するオブジェクト( keyオブジェクトと配列要素)を示す2つの実引数を指定して呼び出す。 比較関数は次の値を返す。

bsearch関数は配列の一致した要素へのポインタを返し, 一致する要素が見つからない場合には空ポインタを返す。

     void qsort(void *base, size_t nmemb,
     size_t size, int (*compar) (const void *,
     const void *));

nmembオブジェクトの配列を同じ場所でソートする。 配列の先頭要素は base が示す。各要素のサイズは size によって指定される。

配列の内容は,compar が示す比較関数に従って昇順でソートされる。 比較関数は比較されるオブジェクトを示す2 つの実引数を指定して呼び出される。比較関数は次の値を返す。

比較した2つの要素が等しい場合には,ソートされた配列の順序は未指定になる。

qsort関数は値を返さない。

整数算術関数

int abs(int j);


j 整数の絶対値を返す。

div_t div(int numer, int denom);


numer denom による除算の商と剰余を計算する。div関数は商と剰余を含む div_t型の構造体を返す。
     int quot;    /* quotient  */
     int rem;     /* remainder */

long int labs(long int j);


j ロング整数の絶対値を返す。

ldiv_t ldiv(long int numer, long int denom);


div関数と類似していますが,返された構造体( ldiv_t型)の実引数とメンバがすべて long int型である点だけが異なる。

多バイト文字関数

int mblen(const char *s, size_t n);


s が空ポインタ以外の場合, mblen s が示す多バイト文字のバイト数を数える。mblen関数は mbtowc のシフト状態が影響を受けない点を除き, 次の関数と等価である。
     mbtowc((wchar_t *)0, s, n);

s が空ポインタの場合,mblen関数は多バイト文字コード化がロケールに依存するコード化である場合には0 以外を返し,それ以外の場合には0を返す。

s が空ポインタ以外の場合,mblen関数は次の値のいずれか1 つを返す。

int mbtowc(wchar_t *pwc, const char *s, size_t n);


s が空ポインタ以外の場合, mbtowc s が示す多バイト文字のバイト数を決める。次に,この多バイト文字に対応する wchar_t型の値のコードを設定する( ヌル文字に対応するコードの値は0)。多バイト文字が有効であり, pwc が空ポインタ以外の場合には, mbtowc pwc が示すオブジェクトにコードを格納する。s が示す配列の nバイトまでが検査される。

s が空ポインタの場合,mbtowc関数は多バイト文字コード化がロケールに依存するコード化である場合には0 以外を返し,それ以外の場合には0を返す。

s が空ポインタ以外の場合, mbtowc関数は次の値のいずれか1つを返す。

int wctomb(char *s, wchar_t wchar);


値が wchar のコードに対応する多バイト文字を表現するために必要なバイト数を, シフト状態の変更を含めて判断する。 その後この関数は s が空ポインタ以外の場合には,s が示す配列オブジェクトに多バイト文字表現を格納する。 MB_CUR_ MAX文字まで格納される。wchar の値が0の場合には, wctomb関数は初期シフト状態のままである。

s が空ポインタの場合,wctomb関数は多バイト文字コード化がロケールに依存するコード化である場合には0 以外の値を返し,それ以外の場合には0を返す。

s が空ポインタ以外の場合, wctomb関数は次の値のいずれか1つを返す。

多バイト文字列関数

size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n);


初期シフト状態で始まる多バイト文字列を s が示す配列から対応するコード列に変換し,n以下のコードを pwcs が示す配列へ格納する。 ヌル文字はコード値0に変換される。ヌル文字に続く多バイト文字は検査も変換も行われない。 各多バイト文字は,mbtowc のシフト状態が影響を受けない点以外は mbtowc を呼び出した場合と同様に変換される。

無効な多バイト文字を検出した場合,mbstowcs関数は (size_t) - 1 を返す。それ以外の場合には変更された配列要素の数を返すが, 終了の0コード(存在する場合) は含まない。

size_t wcstombs(char *s, const wchar_t *pwcs, size_t n);


多バイト文字に対応するコード列を,pwcs が示す配列から初期シフト状態で始まる多バイト文字列へ変換し, これらの多バイト文字を s が示す配列へ格納する。1 つの多バイト文字の合計が n バイトを超えた場合, またはヌル文字が格納された場合,変換は停止する。

各コードは,wctomb のシフト状態が影響を受けない点以外は wctomb を呼び出した場合と同様に変換される。

有効な多バイト文字に対応しないコードを検出した場合, wcstombs関数は (size_t) - 1 を返す。それ以外の場合には変更されたバイト数を返すが, 終了ヌル文字(存在する場合)は含まない。

9.15 文字列処理(<string.h>)

<string.h>ヘッダ・ファイルは1つの型と複数の関数を宣言し, 他のオブジェクトが文字配列として扱う文字配列を処理するために必要な1 つのマクロを定義します。

宣言される文字列関数は2種類あります。第1の関数は名前が str で始まる関数で,文字配列を処理します。 第2の関数は名前が mem で始まる関数で, 文字配列として扱われるその他のオブジェクトを処理します。重複するオブジェクト間でコピーが行われた場合, memmove 以外の関数の動作結果は定義されていません。

size_t


sizeof演算子の結果の符号なし汎整数型。

マクロ

NULL


処理系定義の空ポインタ定数に展開する。

関数

void *memcpy(void *s1, const void *s2, size_t n);


n文字を s2 が示すオブジェクトから s1 が示すオブジェクトへコピーする。 関数は s1 を返す。

void *memmove(void *s1, const void *s2, size_t n);


n文字分だけ,s2 が示すオブジェクトから s1 が示すオブジェクトへコピーする。 コピーは,最初に s2 が示すオブジェクトから n文字分が s1 および s2 が示すオブジェクトと重複しない n文字の一時的配列へコピーされ,次に一時的配列から n文字分が s1 が示すオブジェクトへコピーされるのと同様に行われる。 memmove関数は s1 を返す。

void *memchr(const void *s, int c, size_t n);


c (符号なし char へ変換される) が最初に使用された部分を,s が示すオブジェクトの符号なし文字の先頭の n文字で検索する。 memchr関数は検索された文字へのポインタを返し, 文字が見つからなかった場合には空ポインタを返す。

int memcmp(const void *s1, const void *s2, size_t n);


s1 が示すオブジェクトの先頭の n文字を,s2 が示すオブジェクトの先頭の n文字と比較する。memcmp関数は s1 が示すオブジェクトが s2 が示すオブジェクトより小さいか,等しいか, または大きいかに応じて,それぞれ0より小さい,等しい,または大きい整数を返す。

void *memset(void *s, int c, size_t n);


c (符号なし char へ変換される) の値を,s が示す先頭の n文字へコピーする。関数は s を返す。

char *strcpy(char *s1, const char *s2);


s2 が示す文字列(終了ヌル文字を含む) を,s1 が示す文字列へコピーする。 strcpy関数は s1 を返す。

char *strncpy(char *s1, const char *s2, size_t n);


s2 が示す文字列から終了ヌル文字の前まで, n以下の文字を s1 が示す文字列へコピーする。 strncpy関数は s1 を返す。s2 が示す文字列が n文字より少ない場合,strncpy はコピーにヌル文字を埋め込む。

char *strcat(char *s1, const char *s2);


s2 が示す文字列(終了ヌル文字を含む)のコピーを s1 が示す文字列の終わりに追加する。 strcat関数は s1 を返す。 s2 の先頭文字は s1 のヌル文字を重ね書きする。

char *strncat(char *s1, const char *s2, size_t n);


s2 が示す文字列(ヌル文字の前まで)の n以下の文字を s1 が示す文字列へ追加する。 strncat関数は s1 を返す。s2 の先頭文字は s1 のヌル文字を重ね書きする。終了ヌル文字が結果へ追加される。

int strcmp(const char *s1, const char *s2);


s1 が示す文字列を s2 が示す文字列と比較する。strcmp関数は s1 が示す文字列が s2 が示す文字列より小さいか,等しいか,または大きいかに応じて, それぞれ0より小さい,等しい,または大きい整数を返す。

int strcoll(const char *s1, const char *s2);


s1 が示す文字列を s2 が示す文字列と比較する。両方の文字列とも,現在のロケール( 第9.6節を参照のこと)の LC_COLLATEカテゴリに合うように解釈される。 strcoll関数は両方の文字列が現在のロケールに適切であると解釈された場合に, s1 が示す文字列が s2 が示す文字列より小さいか,等しいか, または大きいかに応じて,それぞれ0より小さい,等しい,または大きい整数を返す。

int strncmp(const char *s1, const char *s2, size_t n);


s1 が示す文字列の n以下の文字を, s2 が示す文字列と比較する。文字列の比較はヌル文字を検出するまで, 文字列に相違点が出るまで, または n に達するまで行われる。 strncmp関数は s1 が示す文字列が s2 が示す文字列より小さいか, 等しいか,または大きいかに応じて,それぞれ0より小さい, 等しい,または大きい整数を返す。

size_t strxfrm(char *s1, const char *s2, size_ t n);


s2 が示す文字列を変換して,s1 が示す配列へ格納する。

この関数についての詳細は,Compaq Cライブラリ・ ルーチンのマニュアルを参照すること。

char *strchr(const char *s, int c);


c (char へ変換される)が最初に使用された部分を, s が示す文字列の中で検索する。 終了ヌル文字は文字列の一部とみなされる。関数は検索された文字へのポインタを返し, 文字が見つからなかった場合には空ポインタを返す。

size_t strcspn(const char *s1, const char *s2);


s2 が示す文字列に見つからない文字のみから構成される, s1 が示す文字列の最大の初期セグメント長を計算する。 strcspn関数はセグメント長を返す。

char *strpbrk(const char *s1, const char *s2);


s2 に示された文字列の任意の文字が, s1 に示された文字列中に使用された最初の部分を検索する。 関数はその文字へのポインタを返し,s2 中の文字が s1 に見つからなかった場合には空ポインタを返す。

char *strrchr(const char *s, int c);


c (char に変換される) が,s に示された文字列で使用された最後の部分を検索する。 終了ヌル文字は文字列の一部とみなされる。関数は検索された文字へのポインタを返し, 文字が見つからなかった場合には空ポインタを返す。

size_t strspn(const char *s1, const char *s2);


s2 が示す文字列の文字のみから構成される, s1 が示す文字列の最大の初期セグメント長を計算する。 strspn関数はセグメント長を返す。

char *strstr(const char *s1, const char *s2);


s2 に示された文字列の任意の文字列(終了ヌル文字を除く) が,s1 に示された文字列中に使用された最初の部分を検索する。 strstr関数は検索された文字列へのポインタを返し, 文字列が見つからなかった場合には空ポインタを返す。 s2 が長さ0の文字列を示している場合には, 関数は s1 を返す。

char *strtok(const char *s1, char *s2);


s1 が示す文字列をトークンのシーケンスに分割する。 各トークンはs2 が示す文字列の文字で区切られる。 strtok () の最初の呼出しで文字をスキップし, s2 にない先頭文字を探す。関数は,s1 が示す文字列中で呼出しから呼出しまでの文字の位置を追跡し, 呼出しが連続的に行われると関数はこの文字列を通じて動作し, 前回の呼出しによって識別されたテキスト・トークンの後に続くテキスト・ トークンを識別する。関数は s2 中の文字と一致する文字をs1 中に見つけると,その s1 中の文字をヌル文字に置き換える。 strtok関数はトークンの先頭文字へのポインタを返し, トークンがない場合には空ポインタを返す。

char *strerror(int errnum);


errnum のエラー番号をエラー・メッセージ文字列にマップし, 文字列へのポインタを返す。示された文字列をプログラムで変更することはできないが, 後続の strerror への呼出しによって重ね書きすることができる。

size_t strlen(const char *s);


s が示す文字列の長さを計算する。関数は終了ヌル文字に先行する文字数を返す。

9.16 型汎用数学(<tgmath.h>)

<tgmath.h>ヘッダは, <math.h>ヘッダと <complex.h>ヘッダを含み, いくつかの型汎用マクロを定義しています。

f (float)や l (long double) 接尾語がない,<math.h>および <complex.h>の関数には, 対応する実数型がdoubleであるパラメータを 1つ以上持っているものがあります。 このような関数(modfを除く)には, 対応する型汎用マクロがあります。[1] 対応する実数型が関数形式内でdoubleのパラメータは, 汎用パラメータです。 このマクロを使用すると,汎用パラメータの引数で関数の実数型と 型ドメインが決定され,関数が呼び出されます。 [2]


注意
絶対値関数(fabs)の型汎用機能は, 本リリースでは複素数型には利用できません。 代りに,各型専用の名前(cabscabsfcabsl)を使用しなければなりません。


[1] 標準ライブラリの 他の関数形式マクロのように,対応する通常の関数を利用できるよう, 各型汎用マクロを抑制することもできます。

[2] 選択された関数のパラメータの型と引数の型が合っていない場合, その動作は未定義です。

9.16.1 実数型の決定(<tgmath.h>)

マクロを使用すると,汎用パラメータに対応する実数型が 次の手順で決定され,その型の関数が呼び出されます。

  1. まず,汎用パラメータにlong double型の引数がある 場合,その型はlong doubleになります。
  2. long double型の引数がなく,汎用パラメータに double型の引数または整数型の引数がある場合, その型はdoubleになります。
  3. 上記以外の場合,その型はfloatになります。

9.16.2 <math.h>と<complex.h>で同じ名前の接尾語なしの関数

<math.h>内の接尾語のない関数で, <complex.h>)内に同じ名前に c接頭語が付いた関数があるものには, <math.h>内の関数と同じ名前の 型汎用マクロ(両方の関数用)があります。 fabscabsに対応する型汎用マクロは, fabsです。 このような関数を,次に示します。

  <math.h>     <complex.h>      型汎用
    関数           関数          マクロ
 -----------   -------------  -------------
   acos           cacos          acos
   asin           casin          asin
   atan           catan          atan
   acosh          cacosh         acosh
   asinh          casinh         asinh
   atanh          catanh         atanh
   cos            ccos           cos
   sin            csin           sin
   tan            ctan           tan
   cosh           ccosh          cosh
   sinh           csinh          sinh
   tanh           ctanh          tanh
   exp            cexp           exp
   log            clog           log
   pow            cpow           pow
   sqrt           csqrt          sqrt
   fabs           cabs           fabs

汎用パラメータに複素数の引数が少なくとも1つあれば, マクロを使用すると,複素数関数が呼び出されます。 複素数の引数がなければ,マクロを使用すると実数関数が呼び出されます。

9.16.3 対応するc接頭語関数が<complex.h>にない,<math.h>の接尾語なし関数

<math.h>内の接尾語のない関数のうち, 対応するc接頭語関数が<complex.h>にない関数には, その関数と同じ名前の,対応する型汎用マクロがあります。 このような型汎用マクロを,次に示します。

atan2         fma           llround       remainder
cbrt          fmax          log10         remquo
ceil          fmin          log1p         rint
copysign      fmod          log2          round
erf           frexp         logb          scalbn
erfc          hypot         lrint         scalbln
exp2          ilogb         lround        tgamma
expm1         ldexp         nearbyint     trunc
fdim          lgamma        nextafter
floor         llrint        nexttoward

汎用パラメータのすべての引数が実数の場合, マクロを使用すると実数関数が呼び出されます。 実数でない引数がある場合,マクロの動作は定義されていません。

9.16.4 <math.h>内の関数に対応するc接頭語付き関数ではない,<complex.h>内の接尾語なし関数

<math.h>内の関数に対応する c接頭語付き関数ではない, <complex.h>内の接尾語なし関数には, その関数と同じ名前の型汎用マクロがあります。

carg          conj          creal
cimag         cproj

このマクロを実数または複素数の引数で使用すると,複素数関数が 呼び出されます。

9.16.5

次のような宣言があるとします。

#include <tgmath.h>
int n;
float f;
double d;
long double ld;
float complex fc;
double complex dc;
long double complex ldc;

このような宣言があると,型汎用マクロを使用したときに呼び出される関数は, 次のとおりとなります。

    使用するマクロ                 呼び出し
   ----------------       -----------------------------
   exp(n)                 exp(n),関数
   acosh(f)               acoshf(f)
   sin(d)                 sin(d),関数
   atan(ld)               atanl(ld)
   log(fc)                clogf(fc)
   sqrt(dc)               csqrt(dc)
   pow(ldc, f)            cpowl(ldc, f)
   remainder(n, n)        remainder(n, n),関数
   nextafter(d, f)        nextafter(d, f),関数
   nexttoward(f, ld)      nexttowardf(f, ld)
   copysign(n, ld)        copysignl(n, ld)
   ceil(fc)               動作は未定義
   rint(dc)               動作は未定義
   fmax(ldc, ld)          動作は未定義
   carg(n)                carg(n),関数
   cproj(f)               cprojf(f)
   creal(d)               creal(d),関数
   cimag(ld)              cimagl(ld)
   cabs(fc)               cabsf(fc)
   carg(dc)               carg(dc),関数
   cproj(ldc)             cprojl(ldc)

9.16.6 虚数引数

複素数引数を使用できる型汎用マクロでは,虚数引数も使用できます。 引数が虚数の場合,マクロはその関数に合わせて,型が実数,虚数, または複素数の式に展開されます。 引数が虚数の場合,coscoshfabscargcimag, およびcrealの型は実数になり, sintansinhtanhasinatanasinh,およびatanhの型は虚数になり, その他の関数の型は複素数になります。

引数が虚数の場合,型汎用マクロcossintancoshsinhtanhasinatanasinhatanhは, 実数関数を使って次の式で規定されます。

   cos(iy)   = cosh(y)
   sin(iy)   = i sinh(y)
   tan(iy)   = i tanh(y)
   cosh(iy)  = cos(y)
   sinh(iy)  = i sin(y)
   tanh(iy)  = i tan(y)
   asin(iy)  = i asinh(y)
   atan(iy)  = i atanh(y)
   asinh(iy) = i asin(y)
   atanh(iy) = i atan(y)

9.17 日付と時刻(<time.h>)

<time.h>ヘッダ・ファイルは2つのマクロを定義し,時間と日付の情報を処理するための4 つの型と複数の関数を宣言します。 一部の関数は,時間帯により暦時間と異なることがあるローカル時間 を処理します。

size_t


sizeof演算子の結果の符号なし汎整数型。
     clock_t
     time_t

時間を表現できる算術型。

struct tm


詳細時間と呼ばれる暦時間の構成要素を保持する。構造体は次のメンバからなる。
     int tm_sec;      /*  seconds after the minute -- [0,61]         */
     int tm_min;      /*  minutes after the hour -- [0,59]           */
     int tm_hour;     /*  hours since midnight -- [0,23]             */
     int tm_mday;     /*  day of the month -- [1,31]                 */
     int tm_mon;      /*  months since January -- [0,11]             */
     int tm_year;     /*  years since 1900                           */
     int tm_wday;     /*  days since Sunday -- [0,6]                 */
     int tm_yday;     /*  days since January 1 -- [0,365]            */
     int tm_isdst;    /*  Daylight Saving Time flag -- 0 if          */
                      /*  DST not in effect; positive if it is;      */
                      /*  negative if information is not available.  */

マクロ

NULL


処理系定義の空ポインタ定数に展開する。

CLOCKS_PER_SEC


clock関数によって返される値の1秒当たりの数。

時間変換関数

char *asctime(const struct tm *timeptr);


timeptr が示す構造体内の詳細時間を,次の例の形式の文字列に変換する。
     Sat Sep 08 08:10:32 1990\n\0

文字列へのポインタが返される。

char *ctime(const time_t *timer);


timer が示す暦時間を, asctime関数によって生成される形式の文字列に変換する。 文字列へのポインタが返される。ctime関数は次の関数と等価である。
     asctime(localtime(timer))

struct tm *gmtime(const time_t *timer);


timer が示す暦時間を,協定世界時(UTC)として表現される詳細時間に変換する。 gmtime関数は詳細時間へのポインタを返すか, またはUTCが使用可能ではない場合には空ポインタを返す。

struct tm *localtime(const time_t *timer);


timer が示す暦時間を,ローカル時間として表現される詳細時間に変換する。 localtime関数は詳細時間へのポインタを返す。

size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);


format が示す文字列の制御に基づいて,文字を s が示す配列へ格納する。書式文字列は,0 個以上の変換指定子と通常の多バイト文字からなる。通常の多バイト文字( 終了ヌル文字を含む)はすべて,変更されずに配列へコピーされる。 各変換指定子は,表 9-2 に示すように適切な文字に置き換えられる。 この文字は,現在のロケールの LC_TIMEカテゴリと, timeptr が示す構造体に含まれている値によって決まる。

表 9-2 strftime変換指定子

指定子 置き換える値
%a ロケールの短縮曜日名
%A ロケールの完全曜日名
%b ロケールの短縮月名
%B ロケールの完全月名
%c ロケールの適切な日付と時刻表現
%d 10進数としての月の日数(01 〜31)
%H 10進数としての時刻(24時クロック) (00〜23)
%I 10進数としての時刻(12 時クロック) (01〜12)
%j 10進数としての年の日数(001〜366)
%m 10進数としての月(01 〜12)
%M 10進数としての分(00〜59)
%p 12時クロックに関連するAM/PM 指定に対するロケールの同値
%S 10進数としての秒(00〜61)
%U 10進数としての年の週数(最初の日曜日が1週目の1日目) (00 〜53)
%w 10進数としての曜日( 0[日曜日]〜6[土曜日] )
%W 10進数としての年の週数(最初の月曜日が1週目の1 日目) (00〜53)
%x ロケールの適切な日付表現
%X ロケールの適切な時刻表現
%y 10進数としての世紀なしの年(00〜99)
%Y 10進数としての世紀付きの年
%Z 時間帯名または短縮形, あるいは時間帯を判定できない場合には文字なし
%% %

生成された文字の合計数が,終了ヌル文字を含めて maxsize以下の場合には, strftime関数は s が示す配列ヘ格納された文字数を終了ヌル文字を含めずに返す。 それ以外の場合には0 が返され,配列の内容は不定になる。

時間処理関数

clock_t clock(void);


使用したプロセッサ時間を判断する。clock関数は, プログラムの起動に関連するイベントの発生以降にそのプログラムが使用したプロセッサ時間を返す。 時間を秒数で判断するには,返却値を CLOCKS_PER_SECマクロの値で除算する。 プロセッサ時間を使用できないか,または表現できない場合,返される値は (clock_t)-1 になる。 プログラムで使用した時間を測定するにはプログラムの起動時に clock関数を呼び出し,返却値を次の呼出しの返却値から減算する。

double difftime(time_t time1, time_t time0);


2つの暦時間である time1 および time0 の差を,double として秒数で表現した値で返す。

time_t mktime(struct tm *timeptr);


timeptr が示す構造体内の,ロケール時間として表現された詳細時間を time関数が返した値と同じコード化で( つまり,time_t型の値で) 返して,暦時間値に変換する。暦時間を表現できない場合には, (time_t)-1 値が返される。

tm_wday および tm_ yday の時間構成要素の元の値は無視され, その他の構成要素の元の値は前述の struct_ tm の説明で示した範囲に制限されない。関数が正常に完了すると tm_wday および tm_yday構成要素の値は適切に設定され, その他の構成要素は指定された暦時間を表現するように設定されるが, その値は struct_ tm の説明で示した範囲に制限される。tm_ wday の最終値は,tm_mon および tm_year が決まるまで設定されない。

time_t time(time_t *timer);


現在の暦時間を返す。暦時間が使用できない場合には (time_t)-1 が返される。