4.1.1 C90の処理系定義

この項では,C90規格における処理系定義について説明します。

(1)

データ型とサイズ

4.1.3 データの内部表現と領域」を参照してください。

(2)

翻訳段階

ANSI規格では,翻訳における構文規則間の優先順位を8つの翻訳段階(翻訳フェーズ)に規定しています。3段階目の“前処理字句と空白類文字の並びへの分割”で処理系定義となっている,“改行文字以外の空白類文字の空でない並び”は1つに置き換えられずそのまま保持されます。

(3)

診断メッセージ

何らかの構文規則違反,および制約違反を含む翻訳単位に対して,ソース・ファイル名,行番号(特定可能な場合のみ)を含むエラー・メッセージを出力します。なお,エラー・メッセージの書式は“ワーニング”,“致命的エラー”,“エラー”などに区別されます。出力形式については,「10.2 出力形式」を参照してください。

(4)

プログラム開始処理

プログラム開始処理時に呼び出される関数の名前,型,および引数は特に規定しません。

したがって,ユーザ・オウン・コーディング,またはターゲット・システムに依存します。

(5)

プログラムの実行

対話型装置の構成については,特に規定しません。

したがって,ユーザ・オウン・コーディング,またはターゲット・システムに依存します。

(6)

文字集合

ソース文字集合および実行文字集合の要素の値は,ASCIIコード,EUC,SJIS,UTF-8,big5,gb2312です。コメントと文字列における日本語/中国語記述をサポートしています。

(7)

多バイト文字のコード化で使用されるシフト状態

シフト状態はサポートしていません。

(8)

文字表示の意味

拡張表記の値は,次のように規定します。

表 4.1

拡張表記と意味

拡張表記

値(ASCII)

意味

\a

07

アラート(警告音)

\b

08

バックスペース

\f

0C

フォーム・フィード(改ページ)

\n

0A

ニュー・ライン(改行)

\r

0D

キャリッジ・リターン(復帰)

\t

09

水平タブ

\v

0B

垂直タブ

(9)

翻訳限界

翻訳に際して次の限界値があります。また,数量的な限界の他に動作するホスト・マシンのメモリに依存します。

-

1つの宣言中の1つの算術型,構造体型,共用体型,または不完全型を修飾するポインタ,配列および関数宣言子(の任意の組み合わせ)の個数は128となります。

-

1つのオブジェクトのバイト数の最大値は32767となります。ただし,オプション-large_variable使用時は,65535となります。

-

switch文におけるcase値の最大数は65535です。

(10)

数量的限界

4.2.3 C90でサポートするC99言語仕様」の「(10) 標準ヘッダ」を参照してください。

(11)

識別子

識別子すべてが意味のあるものとして扱います。

なお,英字の大文字と小文字は区別されます。

(12)

char型

ソース文字集合の要素ではない量をchar型に格納した場合,char型に型変換した値となります。

また,オプション-signed_char不使用時,単なるchar型はunsigned char型と同じ範囲の値を持ちます。オプション-signed_char使用時,単なるchar型はsigned char型と同じ範囲の値を持ちます。

char    ch = '\777';     /*chの値は+255となる*/

(13)

浮動小数点定数

無限の有効桁を持つとして計算した場合の結果と近い方の値へ丸めます。中間時は結果が偶数になる方向へ丸めます。

(14)

文字定数

(a)

ソース・プログラムの文字集合と実行環境における文字集合は,基本的に両者ともASCIIコードで,同一の値をもつメンバと対応します。
ただし,ソース・プログラムにおける文字列には,日本語文字コードが使用できます(「(8) 文字表示の意味」を参照)。

(b)

2文字までの文字を含む単純文字定数は,末尾の文字を下位バイト,先頭の文字を上位バイトに持つint型の値を持ちます。3文字以上の文字を持つ文字定数はエラーとなります。

int a1 = 'a';       /* 0x61 */
int a2 = 'ab';      /* 0x6162 */
int a3 = 'abc';     /* エラー */

(c)

基本的な実行環境文字集合で表現されない文字やエスケープ・シーケンスを含む場合,次のようになります。

<1>

8進数エスケープ・シーケンス,および16進数エスケープ・シーケンスは,その8進数表記,および16進数表記で示される値となります。

\777

511

<2>

単純エスケープ・シーケンスは,次のようになります。

\'

'

\"

"

\?

?

\\

\

<3>

\a,\b,\f,\n,\r,\t,\vについては,「(8) 文字表示の意味」で示されている値と同値になります。

(d)

多バイト文字の文字定数はサポートしていません。

(15)

文字列

文字列中に日本語/中国語が記述できます。

デフォルトの文字コードは,シフトJISとなります。

入力ソース・ファイルの中の文字コードは,CC-RLのオプション-character_setで選択できます。

-character_set=[none | euc_jp | sjis | utf8 | big5 | gbk]

(16)

ロケール

ロケールはサポートしていません。

(17)

ヘッダ・ファイル名

ヘッダ・ファイル名の2つの形式(< >," ")内の列を,ヘッダ・ファイル,または外部ソース・ファイル名に反映する方法は,「(35) ヘッダ・ファイル取り込み」で規定します。

(18)

コメント

コメント中に日本語/中国語が記述できます。文字コードは,「(15) 文字列」の場合と同じです。

(19)

文字型と整数型

signed,unsignedの付かない単なるchar 型を符号なしとして扱います。オプション-signed_char使用時は,符号付きとして扱います。

(20)

符号付き定数と符号なし定数

汎整数型の値がよりサイズの小さい符号付き整数に変換される場合,上位ビットを切り捨てて,ビット列イメージをコピーします。

また,符号なし整数が,対応する符号付き整数に変換される場合,内部表現は変化しません。

(21)

浮動小数点と汎整数

汎整数型の値が浮動小数点型に型変換される際,型変換される値が,表現しうる値の範囲内にはあるが正確に表現することができない場合,その結果は,無限の有効桁を持つとして計算した場合の結果と近い方の値へ丸められます。中間時は結果が偶数になる方向へ丸られます。

(22)

double型とfloat型

double型をfloat型に変換する場合,またはlong double型をdouble型,またはfloat型に変換するとき,型変換される値が,表現しうる値の範囲内にはあるが正確に表現することができない場合,その結果は,無限の有効桁を持つとして計算した場合の結果と近い方の値へ丸められます。中間時は結果が偶数になる方向へ丸られます。

(23)

ビット単位の演算子における符号付き型

ビット単位の演算子における符号付き型に対する特性は,シフト演算子については,「(29) ビット単位のシフト演算子」の規定に準じます。

また,その他の演算子については,符号なしの値として(ビット・イメージのままで)計算するものとします。

(24)

構造体と共用体のメンバ

共用体のメンバの値がそれと異なるメンバに格納される場合,整列条件にしたがって格納されるため,その共用体のあるメンバへのアクセスは,後からアクセスした型としてアクセスされます。

(25)

sizeof演算子

“sizeof”演算子の結果は,unsigned int型とします。

(26)

キャスト演算子

ポインタを汎整数型に変換する場合,要求される変数のサイズは,下記のサイズとなります。

-

near : 2 バイト

-

far : 4 バイト

変換結果は,ビット列がそのまま保存されます。ただしfarポインタの不定値である最上位1 バイトは,ゼロに変換されます。

また,任意の整数はポインタに型変換できますが,ポインタ型のサイズが整数型のサイズよりも小さい場合は,ポインタ型のサイズに切り詰めます。ポインタ型のサイズが整数型のサイズより大きい場合は,整数型をポインタ型のサイズまで通常の型変換した後に,ポインタ型に型変換します。

変換には,nearポインタとfarポインタが関与するため,「メモリ配置領域指定(__near/__far)」中の「キャスト」を参照してください。

(27)

乗除/剰余演算子

整数同士の除算で割り切れず,オペランドが負の値をもつ場合,“/”演算子の結果は,除数,または被除数のいずれか一方が負の場合は,代数的な商よりも大きい最小の整数となります。

ただし,どちらも負の場合は,代数的な商よりも小さい最大の整数となります。

また,オペランドが負の値をもつ場合,“%”演算子の結果の符号は第1オペランドの符号とします。

(28)

加減演算子

同一配列の要素を指す2つのポインタが減算される場合,結果の型はsigned int型となります。

(29)

ビット単位のシフト演算子

“E1 >> E2”において,E1が符号付きの型で負の値をもつ場合,算術シフトを行います。

(30)

記憶域クラス指定子

記憶域クラス指定子“register”の宣言の有無にかかわらず,可能なかぎり高速にアクセスするように最適化を行います。

(31)

構造体と共用体指定子

(a)

signed,unsignedの付かない単なるint型ビット・フィールドは,unsigned int 型となります。ただし,オプション-signed_bitfield 使用時は,signed int 型となります。

(b)

ビット・フィールドを保持するために,十分な大きさの任意のアドレス付け可能な記憶域単位を割り付けることができますが,十分な領域がなかった場合,合わなかったビット・フィールドはフィールドの型の整列条件に合わせて次の単位に詰め込まれます。
単位内のビット・フィールドの割り付け順序は下位から上位です。

(c)

1つの構造体,または共用体の非ビット・フィールドの各メンバは,次のように境界整列されます。

_Bool,char,signed char,unsigned char 型

1 バイトサイズの列挙型,およびその配列

1バイト境界

構造体,共用体を除く上記以外の型,および2 バイトサイズの列挙型

2バイト境界

メンバが構造体,または共用体オブジェクトの場合は,メンバの構造体定義,または共用体定義の境界に従います。

(32)

列挙型指定子

列挙型の型は,定義する列挙定数の範囲によりchar,signed char,unsigned char,signed short型の4種類のいずれかとなります。詳細は「(4) 列挙型」を参照してください。

(33)

型修飾子

“volatile”修飾された型をもつデータへのアクセスは,データがマッピングされているアドレス(I/Oポートなど)に依存します。ただし,同変数へのアクセス箇所への最適化は行わず,必ずアクセスします。

以下のように,特定の条件に該当する同変数へのアクセス・サイズは保証されます。

-

変数がビットフィールドではなく,かつ変数が以下の型で宣言されている場合,当該型の幅と同じ幅でアクセスします。

-

(signed/unsigned)int

-

(signed/unsigned)short

-

near 変数ポインタ

-

near 関数ポインタ

-

(signed/unsigned)char

-

_Bool

-

列挙型

(34)

条件組み込み

(a)

条件組み込みで指定される文字定数に対する値と,その他の式中に現れる文字定数の値とは等しくなります。

(b)

単一文字の文字定数は,負の値を持ちません。

(35)

ヘッダ・ファイル取り込み

(a)

“#include <文字列>”という形式の前処理指示

“#include <文字列>”という形式の前処理指示は,“文字列”がフルパスのファイル名でない場合,指定されたフォルダ(-Iオプション)からヘッダ・ファイルを検索し,次に標準インクルード・ファイル・フォルダ(ccrlが置かれたbinフォルダからの相対パスでの..\incフォルダ)を検索します。

なお,“<”と“>”の区切り記号の間に指定された文字列で一意に識別されるヘッダ・ファイルを探し出すと,そのヘッダ・ファイルの内容全体で置き換えます。

“\”と“/”の両者がフォルダの区切りとしてみなされます。

 

#include    <header.h>

 

検索順は,次のとおりです。

-

-Iで指定したフォルダ

-

標準インクルード・ファイル・フォルダ

(b)

“#include "文字列"”という形式の前処理指示

“#include "文字列"”という形式の前処理指示は,“文字列”がフルパスのファイル名でない場合,ソース・ファイルがあるフォルダからヘッダ・ファイルを検索し,次に,指定したフォルダ(-Iオプション),最後に標準インクルード・ファイル・フォルダ(ccrlが置かれたbinフォルダからの相対パスでの..\incフォルダ)を検索します。

なお,“ " ”“ " ”の区切り記号の間に指定された文字列で一意に識別されるヘッダ・ファイルを探し出すと,そのヘッダ・ファイルの内容全体で置き換えます。

“\”と“/”の両者がフォルダの区切りとしてみなされます。

 

#include    "header.h"

 

検索順は,次のとおりです。

-

現在翻訳対象としているファイル(#include "文字列"を含むファイル)が存在するフォルダ

-

-Iで指定したフォルダ

-

標準インクルード・ファイル・フォルダ

(c)

“#include 前処理字句列”という形式

“#include前処理字句列”という形式において,前処理字句列が単一で<文字列>,または"文字列"の形式に置換されるマクロである場合にのみ,単一のヘッダ・ファイル名の前処理字句として扱われます。

(d)

“#include <文字列>”という形式の前処理指示

(最終的に)区切られた列とヘッダ・ファイル名との間においては,列中の英文字の長さを判別し,

“コンパイラ動作環境において有効なファイル名長までが有効”

となります。ファイルを探すフォルダについては,上記の規定に準じます。

(36)

#pragma指令

4.2.4 #pragma指令」を参照してください。

(37)

あらかじめ定義されたマクロ名

4.2.2 マクロ」を参照してください。

(38)

NULLマクロ

NULLマクロの定義は次の通りです。

#define NULL    ((void *)0)

(39)

標準ライブラリ関数

標準ライブラリ関数の処理系依存項目は次の通りです。

isalnum関数,isalpha関数,iscntrl関数,islower関数,isprint関数およびisupper関数によってテストされる文字集合

unsigned char型(0〜255)およびEOF(-1)とします。

数学関数に定義域エラーが発生した場合に返される値

7.5 ライブラリ関数」を参照してください。

アンダーフロー値域エラーの場合に数学関数がマクロERANGEの値を整数式errnoに設定するか否か

7.5 ライブラリ関数」を参照してください。

fmod関数の第2引数が0の場合に定義域エラーが発生するかまたは0が返されるか

7.5 ライブラリ関数」を参照してください。

signal関数に対するシグナルの集合

CC-RLはsignal関数をサポートしません。

signal関数によって認識されるシグナルの意味

signal関数によって認識されるシグナルに対する既定の処理およびプログラム開始時の処理

シグナル処理ルーチンの呼び出し前に signal(sig, SIG_DFL); と同等のことが実行されない場合のシグナルの遮断の処置

シグナル関数によって指定された処理ルーチンによって SIGILL シグナルが受け付けられる場合に既定の処理が再設定されるか否か

テキストストリームの最終行が終了を示す改行文字を必要とするか否か

改行文字を必要としません。

データが読み取られるとき,改行文字の直前にテキストストリームに書き込まれた空白文字の並びが現れるか否か

現れます。

バイナリストリームに書き込むデータに付加しても良いNULL文字の個数

0個です。付加できません。

追加モードのストリームのファイル位置表示子が,最初にファイルの先頭または終わりのどちらに位置付けされるか

CC-RLはファイル操作関数をサポートしません。

テキストストリームへの書き込みが,結び付けられたファイルを最終書き込み点の直後で切り捨てるか否か

ファイルバッファリングの特性

長さ0のファイルが実際に存在するか否か

正しいファイル名の規則

同一ファイルを複数回オープンすることが可能か否か

オープンされているファイルに対するremove関数の効果

CC-RLはremove関数をサポートしません。

rename関数呼出し前に新しい名前を持つファイルが存在している場合の効果

CC-RLはrename関数をサポートしません。

fprintf関数の%p変換による出力

7.5 ライブラリ関数」を参照してください。

fscanf関数中の %p 変換に対する入力

7.5 ライブラリ関数」を参照してください。

fscanf関数中の%[変換において文字 - が走査文字の並び中の最初の文字でも最後の文字でもない場合の解釈

fgetpos関数またはftell関数が失敗した場合に,マクロerrnoに設定される値

CC-RLはfgetpos関数およびftell関数をサポートしません。

perror関数によって生成されるメッセージ

7.5 ライブラリ関数」を参照してください。

要求された大きさが0の場合のcalloc関数,malloc関数またはrealloc関数の動作

7.5 ライブラリ関数」を参照してください。

オープンされているファイルおよび一時ファイルに関してのabort関数の動作

CC-RLはファイル操作関数をサポートしません。

exit関数の実引数の値が0,EXIT_SUCCESSまたはEXIT_FAILURE以外の場合に返される状態

CC-RLはexit関数をサポートしません。

getenv関数によって使われる環境の名前の集合および環境の並びを変更する方法

CC-RLはgetenv関数をサポートしません。

system関数による文字列の実行モードおよび内容

CC-RLはsystem関数をサポートしません。

strerror関数によって返されるエラーメッセージ文字列の内容

7.5 ライブラリ関数」を参照してください。

地方時および夏時間

CC-RLはtime.hをサポートしません。

clock関数のための時点

CC-RLは時間を扱う関数をサポートしません。