表紙 / 自作ソフト / 日記 / 宝箱 / サイト情報 / 検索
一般 / 新C言語 / 駄文

プログラミング言語 C の新機能


←前頁へ◎表紙へ次頁へ→
 
 

1. 概略
1.1 はじめに
1.2 新しい予約語
1.3 新しいヘッダファイル
2. C プリプロセッサ
2.1 新しいコメント表記方法
2.2 空引数を許された関数型マクロ呼出し
2.3 可変個数引数を持つマクロ定義
2.4 あらかじめ定義されているマクロ名
2.5 プログラミング言語 C 標準プラグマ
2.6 単項演算子 _Pragma
2.7 プリプロセッサ式における整数型
2.8 文字列定数とワイド文字列定数の結合
3. 字句
3.1 ユニバーサルキャラクタ名
3.2 拡張された識別名使用文字
3.3 浮動小数点定数の 16 進数表記
4. 配列
4.1 可変長配列
4.2 構造体中の 0 長配列メンバ
4.3 配列要素中の記憶/型修飾子
5. 整数型
5.1 _Bool 型
5.2 long long int 型
5.3 long long int 型の定数
5.4 整数除算
6. 複素数型
6.1 _Complex 型
6.2 _Imaginary 型
6.3 複素数に関する四則演算
7. 文法一般
7.1 暗黙の関数宣言
7.2 宣言時の暗黙の型
7.3 前定義識別名 __func__
7.4 enum 宣言での余分なカンマ
7.5 inline 関数定義
7.6 restrict ポインタ
7.7 変数宣言と実行コードの位置関係
7.8 指示付きの初期化子 (Designated Initializer)
7.9 複合リテラル (Compound Literal)
7.10 選択文と反復文のブロック化
8. 標準ライブラリ(拡張)
8.1 ctype.h
8.2 float.h
8.3 math.h
8.4 stdarg.h
8.5 stdio.h
8.6 stdlib.h
8.7 wchar.h
8.8 wctype.h
9. 標準ライブラリ(新規)
9.1 complex.h: 複素数
9.2 fenv.h: 浮動小数点環境
9.3 inttypes.h
9.4 stdbool.h
9.5 stdint.h
9.6 tgmath.h: 型総称数学関数
A. 付録
A.1 strftime 書式指定子
A.2 printf の書式

9. 標準ライブラリ(新規)
 本章では、C 言語に新たに追加された、complex.h、fenv.h、inttypes.h、stdbool.h、stdint.h、tgmath.h について説明します。

9.1 complex.h: 複素数
 _Complex 型_Imaginary 型を使いやすくするため、および複素数をサポートする関数のために complex.h が作成されました。今回は、このヘッダで定義されるマクロとプラグマについて説明します。
 まずプラグマにはついては、以前紹介した
  #pragma STDC CX_LIMITED_RANGE
が complex.h を include することで利用可能になります。
 そしてマクロについてです。 complex.h では、complex, imaginary, I というマクロが定義されています。これは _Complex 型や _Imaginary 型を使いやすくするためのものです。具体的に定義例を示すと次のようなものです。

complex.h: マクロ定義例

//complex 型サポート

//他のモジュールで
// const struct { float c[2]; } __cfval01 = {0,1};
//が定義済みとする
#define complex    _Complex
#define _Complex_I  (*(const float _Complex *)&__cfval01)
//↑0.0+1.0i の値を持つ const float _Complex 型の複素数定数

//imaginary 型サポート
//以下二つは、__STD_IEC_559_COMPLEX__ が定義されているときのみ
#ifdef __STD_IEC_559_COMPLEX__
#define imaginary   _Imaginary
#define _Imaginary_I (*(const float _Imaginary *)(__cfval01.c+1))
//↑虚数値 1.0 を持つ虚数型の定数値
#endif

//定数 I サポート
#ifdef _Imaginary_I
#define I       _Imaginary_I
#else
#define I       _Complex_I
#endif

 まずはじめに言っておく必要があるのは、__STD_IEC_559_COMPLEX__ が定義されている場合のみ、_Imaginary 型が使用できるので、定義されていない場合 _Imaginary 型とそれに関係するものは使用できないということです。
 さて complex.h を include すると _Complex や _Imaginary という表記ではなく、complex、imaginary という表記ができるようマクロ定義されます。したがって、double complex val1 のような便利な表記が使用可能になります。
 さらに、I (i の大文字)という記号が定義されます。これは何かというと、複素数で用いられる 1.3+4.5i の i をあらわしています。しかし、i という記号は別の用途で広く利用されているので委員会は、I を当てたようです。では実際どのように用いるのか、どうしてこれを用いると複素数型になるのかを見てみましょう。まず、_Imaginary 型が有効な場合について考えます。例として、1.3+4.5i を考えましょう。これは、C 言語の複素数式で書くと 1.3 + 4.5 * I と書けます。

_Imaginary 型がサポートされている場合
 1.3 + 4.5 * I 通常の計算式同様 * のほうが優先度が高いので 4.5 * I が計算される。I は _Imaginary_I。
 1.3 + 4.5 * _Imaginary_I _Imaginary_I を置き換え
 1.3 + 4.5 * ((const float _Imaginary 型の 1.0) 四則演算のルール、実数型 * _Imaginary 型から結果は _Imaginary 型となる
 1.3 + const double _Imaginary 型の 4.5 四則演算のルール、実数型 + _Imaginary 型から結果は _Complex 型 1.3 + 4.5 iとなる
 (const double _Complex)(1.3 + 4.5*I) 結果として、1.3 + 4.5 * I は左の定数と同じ意味になる

 次に _Imaginary 型がサポートされていない場合を考えてみましょう。委員会は、_Imaginary 型がサポートされていない場合でもそれなりにできるよう、複素数型を設計しました。

_Imaginary 型がサポートされていない場合
 1.3 + 4.5 * I 通常の計算式同様 * のほうが優先度が高いので 4.5 * I が計算される。I は _Complex_I。
 1.3 + 4.5 * _Complex_I _Complex_I は const float _Complex 型の定数 0.0+1.0i と同等の値
 1.3 + 4.5 * const float _Complex 型の 0.0+1.0i の定数値 四則演算のルール、実数型 * _Complex 型から結果は _Complex 型となる
 1.3 + const double _Complex 型の定数値 0.0+4.5i 四則演算のルール、実数型 + _Complex 型から結果は _Complex 型 1.3 + 4.5 iとなる
 (const double _Complex)(1.3 + 4.5*I) 結果として、1.3 + 4.5 * I は左の定数と同じ意味になる

 このように、C 言語では complex.h を include することでかなり自然な表記で複素数を記述することができるようになっています。またこの定義が気に食わない、支障があるような場合、complex、imaginary、I を再定義したり、未定義にしたりすることが許されています。
 さて、次は関数です。complex.h では、複素数を扱った計算が簡単にできるように、多くの関数を用意しています。これらの関数のうち、引数として角度を要求しているものについてはその単位は度ではなくラジアンです。また実装によってはエラーが発生したときに errno に値をセットするものがあります。
 #以下間違ってたらごめんね〜

三角関数(trigonometric functions): csin/ccos/ctan
名前 csin
double complexcsin(double complex z);
float complexcsinf(float complex z);
long double complexcsinl(long double complex z);
ccos
double complexccos(double complex z);
float complexccosf(float complex z);
long double complexccosl(long double complex z);
ctan
double complexctan(double complex z);
float complexctanf(float complex z);
long double complexctanl(long double complex z);
ヘッダcomplex.h
引数z: csin/ccos/ctan の演算に対する引数
戻値演算結果
解説 z で示される値を関数の引数として、それぞれ sin/cos/tan の演算を行います。


逆三角関数(arc trigonometric functions): casin/cacos/catan
名前 casin
double complexcasin(double complex z);
float complexcasinf(float complex z);
long double complexcasinl(long double complex z);
cacos
double complexcacos(double complex z);
float complexcacosf(float complex z);
long double complexcacosl(long double complex z);
catan
double complexcatan(double complex z);
float complexcatanf(float complex z);
long double complexcatanl(long double complex z);
ヘッダcomplex.h
引数z: casin/cacos/catan の演算に対する引数
  casin/cacos:実数部[-1,1]の外側を枝切り
  catan:虚数部[-1,1]の外側を枝切り
戻値演算結果
  casin/catan:実数部は[-π/2,π/2]の範囲
  cacos:実数部は[0,π]の範囲
解説 z で示される値を関数の引数として、それぞれ arc sine/arc cosine/arc tangent の演算を行います。


双曲線関数(hyperbolic functions): csinh/ccosh/ctanh
名前 csinh
double complexcsinh(double complex z);
float complexcsinhf(float complex z);
long double complexcsinhl(long double complex z);
ccosh
double complexccosh(double complex z);
float complexccoshf(float complex z);
long double complexccoshl(long double complex z);
ctanh
double complexctanh(double complex z);
float complexctanhf(float complex z);
long double complexctanhl(long double complex z);
ヘッダcomplex.h
引数z: csinh/ccosh/ctanh の演算に対する引数
戻値演算結果
解説 z で示される値を関数の引数として、それぞれ hyperbolic sine/hyperbolic cosine/hyperbolic tangent の演算を行います。


逆双曲線関数(arc hyperbolic functions): casinh/cacosh/catanh
名前 casinh
double complexcasinh(double complex z);
float complexcasinhf(float complex z);
long double complexcasinhl(long double complex z);
cacosh
double complexcacosh(double complex z);
float complexcacoshf(float complex z);
long double complexcacoshl(long double complex z);
catanh
double complexcatanh(double complex z);
float complexcatanhf(float complex z);
long double complexcatanhl(long double complex z);
ヘッダcomplex.h
引数z: casinh/cacosh/catanh の演算に対する引数
  casinh:虚数部[-1,1]の外側を枝切り
  cacosh:実数部 1 未満の値で枝切り
  catanh:実数部[-1,1]の外側を枝切り
戻値演算結果
  casinh/catanh:虚数部は[-π/2,π/2]の範囲
  cacosh:実数部は非負で、虚数部は[-π,π]の範囲
解説 z で示される値を関数の引数として、それぞれ arc hyperbolic sine/arc hyperbolic cosine/arc hyperbolic tangent の演算を行います。


指数関数(exponential functions): cexp
名前
double complexcexp(double complex z);
float complexcexpf(float complex z);
long double complexcexpl(long double complex z);
ヘッダcomplex.h
引数z: cexp の演算に対する引数
戻値演算結果
解説 z で示される値を関数の引数として、複素数の基数 e の指数を計算します。


自然対数関数(logarithmic functions): clog
名前
double complexclog(double complex z);
float complexclogf(float complex z);
long double complexclogl(long double complex z);
ヘッダcomplex.h
引数z: clog の演算に対する引数(負の実数軸に沿って枝切り)
戻値e を基数とした log の結果(虚数部は[-π,π]の範囲)
解説 z で示される値を関数の引数として、複素数の自然対数(基数 e) の計算を行います。


絶対値関数(absolute-value functions): cabs
名前
doublecabs(double complex z);
floatcabsf(float complex z);
long doublecabsl(long double complex z);
ヘッダcomplex.h
引数z: cabs の演算に対する引数
戻値演算結果
解説 z で示される値を関数の引数として、その絶対値を得ます。


平方根関数(square root functions): csqrt
名前
double complexcsqrt(double complex z);
float complexcsqrtf(float complex z);
long double complexcsqrtl(long double complex z);
ヘッダcomplex.h
引数z: csqrt の演算に対する引数(負の実数軸に沿って枝切り)
戻値演算結果(実数部/虚数部は非負)
解説 z で示される値を関数の引数として、その平方根を得ます。


べき乗関数(power functions): cpow
名前
double complexcpow(double complex x, double complex y);
float complexcpowf(float complex x, float complex y);
long double complexcpowl(long double complex x, long double complex y);
ヘッダcomplex.h
引数x: 被べき乗数(負の実数軸に沿って枝切り)
y: べき乗数
戻値演算結果
解説 xy を計算します。


creal/cimag
名前 creal
doublecreal(double complex z);
floatcrealf(float complex z);
long doublecreall(long double complex z);
cimag
doublecimag(double complex z);
floatcimagf(float complex z);
long doublecimagl(long double complex z);
ヘッダcomplex.h
引数z: 実数部(creal)/虚数部(cimag)を取り出したい値
戻値演算結果
解説 z で示される値を関数の引数として、それぞれその実数部/虚数部の値を取り出します。creal に関しては (double)z/(float)z/(long double)z と同等と思われます。


carg
名前
doublecarg(double complex z);
floatcargf(float complex z);
long doublecargl(long double complex z);
ヘッダcomplex.h
引数z: 位相角度を取得したい値(負の実数軸に沿って枝切り)
戻値演算結果([-π,π]の範囲)
解説 z で示される値を関数の引数として、その複素平面上の位相角度(phase angle)を取得します。


conj
名前
double complexconj(double complex z);
float complexconjf(float complex z);
long double complexconjl(long double complex z);
ヘッダcomplex.h
引数z: 共役複素数を取得したい値
戻値演算結果
解説 z で示される値を関数の引数として、その共役複素数(conjugation)(虚数部の符号が逆)を取得します。


cproj
名前
double complexcproj(double complex z);
float complexcprojf(float complex z);
long double complexcprojl(long double complex z);
ヘッダcomplex.h
引数z: 演算結果を得たい値
戻値演算結果
解説 z で示される値を関数の引数として、リーマン球上での projection を計算します。


9.2 fenv.h: 浮動小数点環境
 C99 では新たに fenv.h を提供しています。このヘッダは、今まで各環境で扱いがバラバラであった浮動小数点演算における例外と丸め制御を抽象化し扱うためのものです。そのため新たなプラグマ、型、マクロ、関数が定義されています。
 まず fenv.h の include で利用可能になるプラグマとしては以前紹介した
  #pragma STDC FENV_ACCESS on-off-switch
があります。
 まず、型とマクロついて示します。

fenv.h 型
型名解説
fenv_t浮動小数点環境全体を表す型
fexcept_t浮動小数点例外フラグ群を表す型。fenv.h で定義される例外フラグの値が入るとは限らない。


fenv.h マクロ
マクロ名解説
例外フラグ
FE_DIVBYZERO
FE_INEXACT
FE_INVALID
FE_OVERFLOW
FE_UNDERFLOW
 fenv.h の中の関数で使用される例外の種類をあらわすマクロ。その例外が実装されているときだけ対応するマクロが定義される。各マクロの値は整数定数(式)に展開される値であり、各値それぞれを bit or できる値。また、FE_UPPERCASESTRING のように、FE_ の後に大文字の文字列が続くマクロは、実装依存の例外をあらわしている。UPPERCASESTRING の部分は、実際は実装依存の例外名に入れ替わる。
FE_ALL_EXCEPT  値 0 に、前記の実装依存の例外フラグを含めた全例外フラグの値を、すべて or した値。
丸めフラグ
FE_UPWARD
FE_DOWNWARD
FE_TOWARDZERO
FE_TONEAREST
 fegetround/fesetround 関数で使用される値で、それぞれの丸めモードがその環境で実装されているときだけ対応するマクロが定義される。各マクロは数定数(式)に展開される。FLT_ROUNDS で利用される値と兼用できる。また、FE_UPPERCASESTRING のように、FE_ の後に大文字の文字列が続くマクロは、実装依存の丸めをあらわしている。UPPERCASESTRING の部分は、実際は実装依存の丸め名に入れ替わる。
環境
FE_DFL_ENV  型 const fenv_t * を持つ、デフォルト浮動小数点環境。cont fenv_t * の型を持つ名前 FE_xxxx は実装依存の環境名をあらわす。xxxx は対応する環境をあらわす名前である。

 次に fenv.h で新たに定義された関数について説明します。

例外(exceptions)制御関数
名前プロトタイプ解説
fegetexceptflag
intfegetexceptflag(fexcept_t *f, int e);
e で指定された例外フラグを実装定義依存の値として f に格納する。もし格納に成功した場合には 0 を、失敗した場合には、非 0 を返す。
fesetexceptflag
intfesetexceptflag(const fexcept_t *f, int e);
f で指定されたオブジェクトでの表現に従い、e で指定された例外フラグに対する完全な状態をセットする。e が 0 か状態の設定に成功した場合には 0 を返す。それ以外は非 0を返す。この関数ではフラグの状態をセットするだけで例外は発生しない。
feclearexcept
intfeclearexcept(int e);
e で指定された例外フラグのクリアを試みる。e が 0 かクリアが成功した場合に 0 を返す。それ以外は非 0 を返す。
fetestexcept
intfetestexcept(int e);
e で指定された例外フラグが現在セットされているか検査し、セットされている例外フラグ値を返す。
feraiseexcep
intferaiseexcept(int e);
e で指定された例外を発生させる。e が 0 か例外の発生に成功した場合は 0 を返す。それ以外は非 0 を返す。overflow または underflow 例外を発生させた後常に inexact 例外を発生させるかどうかは実装依存である。


丸め(rounding)制御関数
名前プロトタイプ解説
fegetround
intfegetround(void);
現在の丸モードを丸めフラグの値で返す。
fesetround
intfesetround(int r);
r で指定された丸めモードにセットする。引数が丸めフラグの値でないときは状態は変更されない。引数で指定された丸め方向に設定できたときに限り 0 を返す。


環境(environment)操作関数
名前プロトタイプ解説
fegetenv
intfegetenv(fenv_t *e);
現在の浮動小数点環境を e に格納する。成功すると 0 を返す。
fesetenv
intfesetenv(const fenv_t *e);
現在の浮動小数点環境に指定された浮動小数点環境 e を設定する。設定に成功すると 0 を返す。
feholdexcept
intfeholdexcept(fenv_t *e);
現在の浮動小数点環境を e に格納し、例外フラグをクリアし、可能であれば全例外に対し(例外でも継続する)非停止モードに設定する。もし非停止モードに設定できたときは 0 を返す。
feupdateenv
intfeupdateenv(const fenv_t *e);
現在発生した例外を一時領域に格納し、e で指定された浮動小数点環境を設定した後、一時領域に格納した例外を発生させる。例外発生に成功した場合には 0 を返す。


9.3 inttypes.h
 stdint.h で定義される整数型、例えば int_fast32_t のような型を使えば、移植性を保ったまま、最も効率のよい整数型を使用することが可能になります。しかし、この型を使った変数を printf で出力したり、scanf で入力することを考えましょう。すると、printf や scanf ではそのような型は定義されていないので指定できません。そのようなことから、利用者は int_fast32_t の実際の型を調べてその型を書式指定名として書かなくてはなりませんが、これでは移植性がなくなってしまいます。
 inttypes.h では、書式指定マクロの定義を提供することによりこの問題を解決します。例えば、printf("val=%"PRIxFAST32"\n",intfast32val) の様にして使用します。なお、inttypes.h は自動的に stdint.h を読み込みます。

書式指定マクロ
 符号intN_tint_leastN_tint_fastN_tintmax_tintptr_t
fprintf符号付きPRIdNPRIdLEASTNPRIdFASTNPRIdMAXPRIdPTR
PRIiNPRIiLEASTNPRIiFASTNPRIiMAXPRIiPTR
符号なしPRIoNPRIoLEASTNPRIoFASTNPRIoMAXPRIoPTR
PRIuNPRIuLEASTNPRIuFASTNPRIuMAXPRIuPTR
PRIxNPRIxLEASTNPRIxFASTNPRIxMAXPRIxPTR
PRIXNPRIXLEASTNPRIXFASTNPRIXMAXPRIXPTR
fscanf符号付きSCNdNSCNdLEASTNSCNdFASTNSCNdMAXSCNdPTR
SCNiNSCNiLEASTNSCNiFASTNSCNiMAXSCNiPTR
符号なしSCNoNSCNoLEASTNSCNoFASTNSCNoMAXSCNoPTR
SCNuNSCNuLEASTNSCNuFASTNSCNuMAXSCNuPTR
SCNxNSCNxLEASTNSCNxFASTNSCNxMAXSCNxPTR
注:
 ・N は前に0の付かない符号なし10進数整数をあらわしている。
 ・C++ では、inttypes.h を include する前に、マクロ __STDC_FORMAT_MACROS を定義した時だけ、これらのマクロが定義される。

 で示したマクロ定義に加えて、inttypes.h では、最大幅を持つ整数型を処理するための新しい関数が追加されています。

プロトタイプ intmax_t strtoimax(const char *restrict s, char ** restrict endptr, int radix);
uintmax_t strtoumax(const char *restrict s, char ** restrict endptr, int radix);
ヘッダinttypes.h
説明strtol や strtoul 関数と同様。ただし、intmax_t, uintmax_t を返す点が違う。
戻り値変換された結果。変換が失敗した場合は0。オーバーフローした場合には、INTMAX_MAX, INTMAX_MIN, UINTMAX_MAX のどれかが返され、errno に ERANGE がセットされる。


プロトタイプ intmax_t wcstoimax(const wchar_t *restrict s, wchar_t ** restrict endptr, int radix);
uintmax_t wcstoumax(const wchar_t *restrict s, wchar_t ** restrict endptr, int radix);
ヘッダinttypes.h
説明wcstol や wcstoul 関数と同様。ただし、intmax_t, uintmax_t を返す点が違う。
戻り値変換された結果。変換が失敗した場合は0。オーバーフローした場合には、INTMAX_MAX, INTMAX_MIN, UINTMAX_MAX のどれかが返され、errno に ERANGE がセットされる。


9.4 stdbool.h
 _Bool 型を便利に簡単にわかりやすく使用できるようにするため、stdbool.h が用意されました。したがって、この型を実際に使用するときには、このヘッダファイルを include することになるでしょう。具体的にはヘッダファイルを見た方が早いと思うので次に示します。

stdbool.h の実装例
/*
 * stdbool.h (c)1999 seclan
 * ver1.00 1999/06/14 最初のバージョン
 */
#ifndef __bool_true_false_are_defined

#define bool  _Bool
#define true  1
#define false 0
#define __bool_true_false_are_defined 1

#endif /* __bool_true_false_are_defined */

 このように stdbool.h を使用することで、bool, true, false と名前を使用することが可能になります。また __bool_true_false_are_defined が定義されるので既存の環境となるべく衝突しないようプログラムを記述することができます。
 ちなみに C++ では _Bool 型は存在しませんが、bool, true, false が存在しており、かつすべて予約語なので、特に何もせずに使用することができます。

9.5 stdint.h
 C 言語のプログラムを移植するときの問題点の一つに、typedef された int 型の大きさがあります。例えば、int型 が 32bit と仮定して、int32 という型を typedef して作ったとします。そしてソースプログラム中で int32 という型を使用します。しかし、他の環境へそのソースプログラムを持っていった時には、int が 32bit でないかもしれません。したがって、もしそのままソースプログラムを使用すると 32bit を仮定しているプログラムなのに、実際は 16bit になってしまったということが起こり得ます。そのようなことから環境が変わった場合、新たに定義し直す必要があります。stdint.h はこの問題の一つの解決方法を提示します。
 整数を、厳密、最小、演算が速い最小、ポインタ格納可能、最も大きな幅、というクラスにわけ、それをみたす型と限界を定義します。だから、例えば、演算が速い最小の整数型を使えば、他の環境へ持っていってもそのままソースプログラムを再利用することができる可能性が高くなるわけです。
 まず型の定義を示します。

以降の定義の注意を示す。型は符号ありと符号なしがセットで提供される。片方だけが提供されることはない。N は前に0の付かない符号なし10進数整数をあらわしている。


厳密な幅を持つ整数型に関する定義
定義名説明
intN_t符号付き整数型の typedef 名
uintN_t符号なし整数型の typedef 名
厳密にその幅を持つ整数型。これらの型は任意であるが、もし実装が 8, 16, 32, 64 ビットの整数型を提供しているなら相当する typedef 名を定義する必要がある。
例:N=32の場合:int32_t, uint32_t


最小の幅を持つ整数型に関する定義
定義名説明
int_leastN_t少なくとも N bit を持つ符号付き整数型の typedef 名
uint_leastN_t少なくとも N bit を持つ符号なし整数型の typedef 名
その幅を持つ最小の整数型。 int_least8_t, int_least16_t, int_least32_t, int_least64_t, uint_least8_t, uint_least16_t, uint_least32_t, uint_least64_t は必須である。その他の型は任意である。


最も演算の速い最小の幅を持つ整数型に関する定義
定義名説明
int_fastN_t少なくとも N bit を持つ最も演算の速い符号付き整数型の typedef 名
uint_fastN_t少なくとも N bit を持つ最も演算の速い符号なし整数型の typedef 名
少なくともその幅を持つ最も演算の速い整数型。これらは、一般的に速いというだけで、すべての目的で最も高速であるということは保証されていない。 int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t, uint_fast64_t は必須である。その他の型は任意である。


ポインタを格納可能な整数型に関する定義
定義名説明
intptr_tポインタを格納するのに適切な符号付き整数型の typedef 名
uintptr_tポインタを格納するのに適切な符号なし整数型の typedef 名
void* を (u)intptr_t に変換でき、かつそれを void* に戻せ、その結果が元のポインタと等しくできる整数型。これらの型は任意である。


最も大きな幅を持つ整数型に関する定義
定義名説明
intmax_t符号付き整数型の最も大きな幅を持つ符号付き整数型の typedef 名
uintmax_t符号なし整数型の最も大きな幅を持つ符号なし整数型の typedef 名
これらの型は必須である。

 次に stdint.h に含まれる、各型の限界の定義について説明します。

以降の定義の注意を示す。C++ では stdint.h を読み込む前に __STDC_LIMIT_MACROS を定義したときだけ以下のマクロが定義される。これらは、#if 式で利用可能である。N は前に0の付かない符号なし10進数整数をあらわしている。


厳密な幅を持つ整数型に関する限界
定義名説明
INTN_MIN1-2N-1または-2N-1符号付き整数型の最小値のマクロ名
INTN_MAX2N-1-1符号付き整数型の最大値のマクロ名
UINTN_MAX2N-1符号なし整数型の最大値のマクロ名
例:N=32の場合
  INT32_MIN1-232-1=-2,147,483,647
  または-232-1=-2,147,483,648
  INT32_MAX232-1-1=2,147,483,647
  UINT32_MAX232-1=4,294,967,295


最小の幅を持つ整数型に関する限界
定義名保証値説明
INT_LEASTN_MIN1-2N-1符号付き整数型の最小値のマクロ名
INT_LEASTN_MAX2N-1-1符号付き整数型の最大値のマクロ名
UINT_LEASTN_MAX2N-1符号なし整数型の最大値のマクロ名


最も演算の速い最小の幅を持つ整数型に関する限界
定義名保証値説明
INT_FASTN_MIN1-2N-1符号付き整数型の最小値のマクロ名
INT_FASTN_MAX2N-1-1符号付き整数型の最大値のマクロ名
UINT_FASTN_MAX2N-1符号なし整数型の最大値のマクロ名


ポインタを格納可能な整数型に関する限界
定義名保証値説明
INTPTR_MIN-32767符号付き整数型の最小値のマクロ名
INTPTR_MAX32767符号付き整数型の最大値のマクロ名
UINTPTR_MAX65535符号なし整数型の最大値のマクロ名


最も大きな幅を持つ整数型に関する限界
定義名保証値説明
INTMAX_MIN1-263符号付き整数型の最小値のマクロ名
INTMAX_MAX263-1符号付き整数型の最大値のマクロ名
UINTMAX_MAX264-1符号なし整数型の最大値のマクロ名


その他の整数型に関する限界
定義名保証値説明
PTRDIFF_MIN-65535ptrdiff_t の下限のマクロ名
PTRDIFF_MAX65535ptrdiff_t の上限のマクロ名
SIG_ATOMIC_MIN-127sig_atomic_t が符号あり整数で定義されたときの下限のマクロ名
0sig_atomic_t が符号なし整数で定義されたときの下限のマクロ名
SIG_ATOMIC_MAX127sig_atomic_t が符号あり整数で定義されたときの上限のマクロ名
255sig_atomic_t が符号なし整数で定義されたときの上限のマクロ名
WCHAR_MIN-127wchar_t が符号あり整数で定義されたときの下限のマクロ名
0wchar_t が符号なし整数で定義されたときの下限のマクロ名
WCHAR_MAX127wchar_t が符号あり整数で定義されたときの上限のマクロ名
255wchar_t が符号なし整数で定義されたときの上限のマクロ名
WINT_MIN-32767wint_t が符号あり整数で定義されたときの下限のマクロ名
0wint_t が符号なし整数で定義されたときの下限のマクロ名
WINT_MAX32767wint_t が符号あり整数で定義されたときの上限のマクロ名
65535wint_t が符号なし整数で定義されたときの上限のマクロ名
SIZE_MAX65535size_t の上限のマクロ名


整数定数用マクロ
定義名説明
INTN_C()を int_leastN_t を型とする符号付き整数定数式へ展開するマクロ
UINTN_C()を uint_leastN_t を型とする符号なし整数定数式へ展開するマクロ
INTMAX_C()を intmax_t を型とする符号付き整数定数式へ展開するマクロ
UINTMAX_C()を uintmax_t を型とする符号なし整数定数式へ展開するマクロ


9.6 tgmath.h: 型総称数学関数
 今まで見てきたように、今回の C 言語では complex 型がサポートされ、また数学関係の関数が大量に追加、強化されています。しかし、実際の使用では面倒なことが起こることがあります。例えば、sin 関数を使うことを考えると、float 型の引数に対しては sinf を、double 型の変数に対しては sin を使用する必要があります。しかし後から精度が足りなくなってそれらの型を long double 型に変更した場合には、すべての関数名を sinl に変更しなくてはなりません。これは面倒です。またいちいち実数型、複素数型の関数名を覚えるのは面倒です。sin って書いたら適当に判別してくれたらいいのに! tgmath.h はまさにその機能を提供します。
 tgmath.h を include すると、引数型に応じ自動的に適切な名前に関数名が展開されます。例えば、sin 関数の引数に double 型または int 型を書くと sin 関数に、long double 型を書くと sinl 関数に、float 型を書くと sinf に、float complex 型を書くと csinf に、long double complex 型を書くと csinl にといった具合です。
 実際の展開方法は次のように行います。まず、引数が complex 型である場合、対応する complex.h の中にある複素数関数に展開されます。もし引数に long double 型があるなら math.h の中の対応する実数関数 xxxxl に展開されます。もし引数に double 型または int 型のような整数型があるなら実数関数 xxxx に展開されます。さもなくば、float 型の指定とみなし xxxxf に展開します。また展開の結果対応する関数が存在していないような場合、その動作は未定義となります。
 なお、tgmath.h は自動的に math.h と complex.h を include します。
 最後に、tgmath.h で定義される関数名とその展開後の名前の一覧を示します。

tgmath.h で定義されるマクロとその展開先関数名一覧
tgmath.hmath.hcomplex.h
genericdoublefloatlong doubledouble complexfloat complexlong double complex
sinsinsinfsinlcsincsinfcsinl
coscoscosfcoslccosccosfccosl
tantantanftanlctanctanfctanl
asinasinasinfasinlcasincasinfcasinl
acosacosacosfacoslcacoscacosfcacosl
atanatanatanfatanlcatancatanfcatanl
sinhsinhsinhfsinhlcsinhcsinhfcsinhl
coshcoshcoshfcoshlccoshccoshfccoshl
tanhtanhtanhftanhlctanhctanhfctanhl
asinhasinhasinhfasinhlcasinhcasinhfcasinhl
acoshacoshacoshfacoshlcacoshcacoshfcacoshl
atanhatanhatanhfatanhlcatanhcatanhfcatanhl
expexpexpfexplcexpcexpfcexpl
logloglogfloglclogclogfclogl
powpowpowfpowlcpowcpowfcpowl
sqrtsqrtsqrtfsqrtlcsqrtcsqrtfcsqrtl
fabsfabsfabsffabslcabscabsfcabsl
atan2atan2atan2fatan2lN/A
cbrtcbrtcbrtfcbrtlN/A
ceilceilceilfceillN/A
copysigncopysigncopysignfcopysignlN/A
erferferfferflN/A
erfcerfcerfcferfclN/A
exp2exp2exp2fexp2lN/A
expm1expm1expm1fexpm1lN/A
fdimfdimfdimffdimlN/A
floorfloorfloorffloorlN/A
fmafmafmaffmalN/A
fmaxfmaxfmaxffmaxlN/A
fminfminfminffminlN/A
fmodfmodfmodffmodlN/A
frexpfrexpfrexpffrexplN/A
hypothypothypotfhypotlN/A
ilogbilogbilogbfilogblN/A
ldexpldexpldexpfldexplN/A
lgammalgammalgammaflgammalN/A
llrintllrintllrintfllrintlN/A
llroundllroundllroundfllroundlN/A
log10log10log10flog10lN/A
log1plog1plog1pflog1plN/A
log2log2log2flog2lN/A
logblogblogbflogblN/A
lrintlrintlrintflrintlN/A
lroundlroundlroundflroundlN/A
nearbyintnearbyintnearbyintfnearbyintlN/A
nextafternextafternextafterfnextafterlN/A
nexttowardnexttowardnexttowardfnexttowardlN/A
remainderremainderremainderfremainderlN/A
remquoremquoremquofremquolN/A
rintrintrintfrintlN/A
roundroundroundfroundlN/A
scalbnscalbnscalbnfscalbnlN/A
scalblnscalblnscalblnfscalblnlN/A
tgammatgammatgammaftgammalN/A
trunctrunctruncftrunclN/A
crealN/Acrealcrealfcreall
cimagN/Acimagcimagfcimagl
cargN/Acargcargfcargl
conjN/Aconjconjfconjl
cprojN/Acprojcprojfcprojl
注意:
 N/A には対応する関数が存在しない。指定すると未定義の動作を意味する。
 []色以外のすべての関数は、今回の C の規格で追加された関数。


←前頁へ◎表紙へ次頁へ→
 
 
表紙 - 著作権 - 注意事項 - リンクについて - 404 エラーについて
(c)1999-2014 seclan. All rights reserved.