4.1.4 C99言語機能

この項では,CC-RLがサポートするC99言語機能について説明します。

(1)

//によるコメント

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

(2)

ワイド文字列の結合

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

(3)

_Bool型

_Bool型をサポートします。

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

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

(4)

long long int型

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

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

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

(5)

汎整数拡張

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

オプション-ansi 使用時は_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,};

 

オプション-ansi 使用時はエラーとなります。

(9)

整数定数の型

long long型の追加に伴って,整数定数の型は次のとおりになります。

整数定数の型は,次の並びのうちでその値を表現できる最初の型となります。

表 4.6

整数定数の型(long long型が有効な場合(-ansi指定なし))

接尾語

10進定数

2進定数,8進定数,または16進定数

なし

int

long int

unsigned long int

long long int

unsigned long long int

int

unsigned int

long int

unsigned long int

long long int

unsigned long long int

u,またはU

unsigned int

unsigned long int

unsigned long long int

unsigned int

unsigned long int

unsigned long long int

l,またはL

long int

unsigned long int

long long int

long int

unsigned long int

long long int

unsigned long long int

u,またはU,およびl ,またはL の両方

unsigned long int

unsigned long long int

unsigned long int

unsigned long long int

ll,またはLL

long long int

long long int

unsigned long long int

u,またはU,およびll ,またはLLの両方

unsigned long long int

unsigned long long int

C99の仕様と異なります。これはC90 であれば4 バイト・データであるところを,8 バイト・データになることを回避するためです。

表 4.7

整数定数の型(long long型が無効な場合(-ansi指定あり))

接尾語

10進定数

2進定数,8進定数,または16進定数

なし

int

long int

unsigned long int

int

unsigned int

long int

unsigned long int

u,またはU

unsigned int

unsigned long int

unsigned int

unsigned long int

l,またはL

long int

long int

unsigned long int

u,またはU,およびl ,またはL の両方

unsigned long int

unsigned long int

(10)

標準ヘッダの追加

標準ヘッダstdint.hを追加します。

stdint.hでは,以下の型を定義します。

表 4.8

stdint.hの型定義名

型名

実際の型

備考

int8_t

signed char

 

int16_t

signed short

 

int32_t

signed long

 

int64_t

signed long long

-ansi不使用時

uint8_t

unsigned char

 

uint16_t

unsigned short

 

uint32_t

unsigned long

 

uint64_t

unsigned long long

-ansi不使用時

int_least8_t

signed char

 

int_least16_t

signed short

 

int_least32_t

signed long

 

int_least64_t

signed long long

-ansi不使用時

uint_least8_t

unsigned char

 

uint_least16_t

unsigned short

 

uint_least32_t

unsigned long

 

uint_least64_t

unsigned long long

-ansi不使用時

int_fast8_t

signed char

 

int_fast16_t

signed short

 

int_fast32_t

signed long

 

int_fast64_t

signed long long

-ansi不使用時

uint_fast8_t

unsigned char

 

uint_fast16_t

unsigned short

 

uint_fast32_t

unsigned long

 

uint_fast64_t

unsigned long long

-ansi不使用時

intptr_t

signed long

 

uintptr_t

unsigned long

 

intmax_t

signed long

-ansi使用時

signed long long

-ansi不使用時

uintmax_t

unsigned long

-ansi使用時

unsigned long long

-ansi不使用時

 

stdint.hでは,以下のマクロを定義します。

表 4.9

stdint.hのマクロ定義名

マクロ名

備考

INT8_MIN

-128

 

INT16_MIN

-32768

 

INT32_MIN

-2147483648

 

INT64_MIN

-9223372036854775808

-ansi不使用時

INT8_MAX

+127

 

INT16_MAX

+32767

 

INT32_MAX

+2147483647

 

INT64_MAX

+9223372036854775807

-ansi不使用時

UINT8_MAX

+255

 

UINT16_MAX

+65535

 

UINT32_MAX

+4294967295

 

UINT64_MAX

+18446744073709551615

-ansi不使用時

INT_LEAST8_MIN

-128

 

INT_LEAST16_MIN

-32768

 

INT_LEAST32_MIN

-2147483648

 

INT_LEAST64_MIN

-9223372036854775808

-ansi不使用時

INT_LEAST8_MAX

+127

 

INT_LEAST16_MAX

+32767

 

INT_LEAST32_MAX

+2147483647

 

INT_LEAST64_MAX

+9223372036854775807

-ansi不使用時

UINT_LEAST8_MAX

+255

 

UINT_LEAST16_MAX

+65535

 

UINT_LEAST32_MAX

+4294967295

 

UINT_LEAST64_MAX

+18446744073709551615

-ansi不使用時

INT_FAST8_MIN

-128

 

INT_FAST16_MIN

-32768

 

INT_FAST32_MIN

-2147483648

 

INT_FAST64_MIN

-9223372036854775808

-ansi不使用時

INT_FAST8_MAX

+127

 

INT_FAST16_MAX

+32767

 

INT_FAST32_MAX

+2147483647

 

INT_FAST64_MAX

+9223372036854775807

-ansi不使用時

UINT_FAST8_MAX

+255

 

UINT_FAST16_MAX

+65535

 

UINT_FAST32_MAX

+4294967295

 

UINT_FAST64_MAX

+18446744073709551615

-ansi不使用時

INTPTR_MIN

-2147483648

 

INTPTR_MAX

+2147483647

 

UINTPTR_MAX

+4294967295

 

INTMAX_MIN

-2147483648

-ansi使用時

-9223372036854775808

-ansi不使用時

INTMAX_MAX

+2147483647

-ansi使用時

+9223372036854775807

-ansi不使用時

UINTMAX_MAX

+4294967295

-ansi使用時

+18446744073709551615

-ansi不使用時

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);