4.2.3 C90でサポートするC99言語仕様

CC-RLでは,C90準拠時(-lang=c指定時)でも,一部のC99規格の仕様が有効です。

(1)

//によるコメント

//(スラッシュ2つ)より始まり改行までをコメントとします。改行の直前の文字が\の場合,次の行も続いた1つのコメントとします。

(2)

ワイド文字列の結合

文字列定数とワイド文字列定数を結合した場合,ワイド文字列定数となります。

(3)

_Bool型

_Bool型をサポートします。

_Bool 型は1 バイトの整数型ですが,0 または1 のみを保持します。

オプション-lang=cかつ-strict_std 使用時は_Bool 型をサポートしないので,コンパイル・エラーとなります。

(4)

long long int型

long long int型をサポートします。long long int型は8バイトの整数型です。

定数値の末尾LLおよびULLもサポートします。ビット・フィールドの型にも指定可能です。

オプション-lang=cかつ-strict_std 使用時はlong long int型をサポートしないので,コンパイル・エラーとなります。

(5)

汎整数拡張

_Bool型とlong long型のサポートに伴って,汎整数拡張もC99 の仕様に従います。

オプション-lang=cかつ-strict_std 使用時は_Bool 型とlong long 型をサポートしないので,C90 の仕様に従います。

(6)

集成体の初期化

自動記憶域期間を持つ集成体型オブジェクトおよび共用体型オブジェクトの初期化子は,C99の 仕様に従います。

C90 仕様では,初期化子に定数式のみを使用可能ですが,定数式以外も使用可能とします。

void func(int param) {
        int i = param;              //C90,C99ともにOK
        int array[] = { param };    //C90ではNG,C99ではOK,CC-RLではともにOK

(7)

既定の実引数拡張

_Bool 型とlong long 型のサポートに伴って,既定の実引数拡張もC99 の仕様に従います。

-

_Bool型はint型(2 バイト)に拡張して関数を呼び出します。

-

(unsigned) long long型は,8 バイトのまま関数を呼び出します。

-

オプション-dbl_size=4使用時は,float型は4 バイトのまま関数を呼び出します。
これはオプションの作用により,float型をdouble型に拡張しても,double型が4 バイト(float型に等しい)であるためです。

 

nearポインタは,farポインタに変換されます。

void*は変数ポインタの規則に従います。

(8)

enum定義の最後の列挙子の後のカンマ許可

enum型を定義する際,列挙子の列挙の最後の” , (カンマ)”を許可します。

enum EE {a, b, c,};

 

オプション-lang=cかつ-strict_std 使用時はエラーとなります。

(9)

整数定数の型

long long型の追加に伴い,整数定数の型が変わります。詳細は「4.1.3 データの内部表現と領域」の「(c) 整数定数」を参照してください。

(10)

標準ヘッダ

(a)

limits.h

表 4.11

limits.h

名前

意味

CHAR_BIT

+8

ビット・フィールドではない最小のオブジェクトのビット数(= 1バイト)

SCHAR_MIN

-128

signed char型の最小値

SCHAR_MAX

+127

signed char型の最大値

UCHAR_MAX

+255

unsigned char型の最大値

CHAR_MIN

0(-128)

char型の最小値(デフォルトはunsigned。オプション-signed_char でsigned になります。)

CHAR_MAX

+255(+127)

char型の最大値(デフォルトはunsigned。オプション-signed_char でsigned になります。)

SHRT_MIN

-32768

short int型の最小値

SHRT_MAX

+32767

short int型の最大値

USHRT_MAX

+65535

unsigned short int型の最大値

INT_MIN

-32768

int型の最小値

INT_MAX

+32767

int型の最大値

UINT_MAX

+65535

unsigned int型の最大値

LONG_MIN

-2147483648

long int型の最小値

LONG_MAX

+2147483647

long int型の最大値

ULONG_MAX

+4294967295

unsigned long int型の最大値

LLONG_MIN

-9223372036854775808

long long int型の最小値

(オプション-lang=cかつ-strict_std使用時は無効)

LLONG_MAX

+9223372036854775807

long long int型の最大値

(オプション-lang=cかつ-strict_std使用時は無効)

ULLONG_MAX

+18446744073709551615

unsigned long long int型の最大値

(オプション-lang=cかつ-strict_std使用時は無効)

(b)

float.h

()内は,sizeof(double)=sizeof(long double)=4にするオプション(-dbl_size=4)指定時の値です。CC-RLは,-dbl_size=4をデフォルト動作とします。

表 4.12

float.h

名前

意味

FLT_ROUNDS

+1

浮動小数点加算に対する丸めのモード

1(もっとも近傍へ丸める)とします。

FLT_EVAL_METHOD

0

浮動小数点数の評価形式

(-lang=c指定時は無効)

FLT_RADIX

+2

指数表現の基数(b)

FLT_MANT_DIG

+24

浮動小数点仮数部におけるFLT_RADIXを底とする数字の桁数(p)

DBL_MANT_DIG

+53(+24)

LDBL_MANT_DIG

+53(+24)

DECIMAL_DIG

+17(+9)

基数bのp桁をもつ浮動小数点数をq桁の10進数の浮動小数点数に丸めることができ,再び変更なしに基数bのp桁をもつ浮動小数点数に戻すことが可能な10進数の桁数(q)

(-lang=c指定時は無効)

FLT_DIG

+6

q桁の10進数の浮動小数点数を基数bのp桁をもつ浮動小数点数に丸めることができ,再び変更なしにq桁の10進数値に戻すことが可能な10進数の桁数(q)

DBL_DIG

+15(+6)

LDBL_DIG

+15(+6)

FLT_MIN_EXP

-125

FLT_RADIXをその値から1引いた値でべき乗したとき,正規化された浮動小数点数となるような最小の負の整数

(emin

DBL_MIN_EXP

-1021(-125)

LDBL_MIN_EXP

-1021(-125)

FLT_MIN_10_EXP

-37

10をその値でべき乗したとき,正規化された浮動小数点数の範囲内になるような最小の負の整数

log10bemin-1

DBL_MIN_10_EXP

-307(-37)

LDBL_MIN_10_EXP

-307(-37)

FLT_MAX_EXP

+128

FLT_RADIXをその値から1引いた値でべき乗したとき,表現可能な有限浮動小数点数となるような最大の整数

(emax

DBL_MAX_EXP

+1024(+128)

LDBL_MAX_EXP

+1024(+128)

FLT_MAX_10_EXP

+38

10をその値でべき乗したとき,表現可能な有限浮動小数点数の範囲内になるような最大の整数

log10 ((1 - b-p) * bemax)

DBL_MAX_10_EXP

+308(+38)

LDBL_MAX_10_EXP

+308(+38)

FLT_MAX

3.40282347E + 38F

表現可能な有限浮動小数点数の最大値

(1 - b-p)*bemax

DBL_MAX

1.7976931348623158E+308(3.40282347E+38F)

LDBL_MAX

1.7976931348623158E+308(3.40282347E+38F)

FLT_EPSILON

1.19209290E - 07F

指定された浮動小数点型で表現できる1.0と,1.0より大きい最も小さい値との差異

b1 - p

DBL_EPSILON

2.2204460492503131E-016(1.19209290E - 07F)

LDBL_EPSILON

2.2204460492503131E-016(1.19209290E - 07F)

FLT_MIN

1.17549435E - 38F

正規化された正の浮動小数点数の最小値

bemin - 1

DBL_MIN

2.2250738585072014E-308(1.17549435E - 38F)

LDBL_MIN

2.2250738585072014E-308(1.17549435E - 38F)

(c)

stdint.h

表 4.13

stdint.hの型定義名

型名

実際の型

備考

int8_t

signed char

 

int16_t

signed short

 

int32_t

signed long

 

int64_t

signed long long

-strict_std不使用時,

または-lang=c99使用時

uint8_t

unsigned char

 

uint16_t

unsigned short

 

uint32_t

unsigned long

 

uint64_t

unsigned long long

-strict_std不使用時,

または-lang=c99使用時

int_least8_t

signed char

 

int_least16_t

signed short

 

int_least32_t

signed long

 

int_least64_t

signed long long

-strict_std不使用時,

または-lang=c99使用時

uint_least8_t

unsigned char

 

uint_least16_t

unsigned short

 

uint_least32_t

unsigned long

 

uint_least64_t

unsigned long long

-strict_std不使用時,

または-lang=c99使用時

int_fast8_t

signed char

 

int_fast16_t

signed short

 

int_fast32_t

signed long

 

int_fast64_t

signed long long

-strict_std不使用時,

または-lang=c99使用時

uint_fast8_t

unsigned char

 

uint_fast16_t

unsigned short

 

uint_fast32_t

unsigned long

 

uint_fast64_t

unsigned long long

-strict_std不使用時,

または-lang=c99使用時

intptr_t

signed long

 

uintptr_t

unsigned long

 

intmax_t

signed long

-lang=c使用,

かつ-strict_std使用時

signed long long

-strict_std不使用時,

または-lang=c99使用時

uintmax_t

unsigned long

-lang=c使用,

かつ-strict_std使用時

unsigned long long

-strict_std不使用時,

または-lang=c99使用時

 

表 4.14

stdint.hのマクロ定義名

マクロ名

備考

INT8_MIN

-128

 

INT16_MIN

-32768

 

INT32_MIN

-2147483648

 

INT64_MIN

-9223372036854775808

-strict_std不使用時,

または-lang=c99使用時

INT8_MAX

+127

 

INT16_MAX

+32767

 

INT32_MAX

+2147483647

 

INT64_MAX

+9223372036854775807

-strict_std不使用時,

または-lang=c99使用時

UINT8_MAX

+255

 

UINT16_MAX

+65535

 

UINT32_MAX

+4294967295

 

UINT64_MAX

+18446744073709551615

-strict_std不使用時,

または-lang=c99使用時

INT_LEAST8_MIN

-128

 

INT_LEAST16_MIN

-32768

 

INT_LEAST32_MIN

-2147483648

 

INT_LEAST64_MIN

-9223372036854775808

-strict_std不使用時,

または-lang=c99使用時

INT_LEAST8_MAX

+127

 

INT_LEAST16_MAX

+32767

 

INT_LEAST32_MAX

+2147483647

 

INT_LEAST64_MAX

+9223372036854775807

-strict_std不使用時,

または-lang=c99使用時

UINT_LEAST8_MAX

+255

 

UINT_LEAST16_MAX

+65535

 

UINT_LEAST32_MAX

+4294967295

 

UINT_LEAST64_MAX

+18446744073709551615

-strict_std不使用時,

または-lang=c99使用時

INT_FAST8_MIN

-128

 

INT_FAST16_MIN

-32768

 

INT_FAST32_MIN

-2147483648

 

INT_FAST64_MIN

-9223372036854775808

-strict_std不使用時,

または-lang=c99使用時

INT_FAST8_MAX

+127

 

INT_FAST16_MAX

+32767

 

INT_FAST32_MAX

+2147483647

 

INT_FAST64_MAX

+9223372036854775807

-strict_std不使用時,

または-lang=c99使用時

UINT_FAST8_MAX

+255

 

UINT_FAST16_MAX

+65535

 

UINT_FAST32_MAX

+4294967295

 

UINT_FAST64_MAX

+18446744073709551615

-strict_std不使用時,

または-lang=c99使用時

INTPTR_MIN

-2147483648

 

INTPTR_MAX

+2147483647

 

UINTPTR_MAX

+4294967295

 

INTMAX_MIN

-2147483648

-lang=c使用,

かつ-strict_std使用時

-9223372036854775808

-strict_std不使用時,

または-lang=c99使用時

INTMAX_MAX

+2147483647

-lang=c使用,

かつ-strict_std使用時

+9223372036854775807

-strict_std不使用時,

または-lang=c99使用時

UINTMAX_MAX

+4294967295

-lang=c使用,

かつ-strict_std使用時

+18446744073709551615

-strict_std不使用時,

または-lang=c99使用時

PTRDIFF_MIN

-32768

 

PTRDIFF_MAX

+32767

 

SIZE_MAX

+65535

 

(11)

可変個引数マクロ

可変個引数マクロを許可します。

#define pf(form,...) printf(form, __VA_ARGS__)
 
pf("%s %d\n", "string", 100);
printf("%s %d\n", "string", 100);