ANSI 処理系固有規格

提供: Appmethod Topics
移動先: 案内検索

C++ 言語ガイド:インデックス への移動


ANSI C 規格の中には、ANSI が正確に定義していないものがあります。その部分については、C コンパイラの処理系ごとに、独自に定義することができます。このトピックでは、そういった処理系固有規格を Embarcadero がどう定義しているかを説明します。セクション番号は、1990 年 2 月の C ANSI/ISO 規格のものを指しています。C と C++ は異なっていて、このトピックで扱うのは C のみです。

2.1.1.3 診断の認識方法

オプションを正しく組み合わせてコンパイラを実行した場合、コンパイラが発行するメッセージのうち FatalErrorWarning のいずれかで始まるものは、ANSI で指定された意味での診断になります。この解釈を行うために必要なオプションは次のとおりです。

オプション 動作

-A

ANSI キーワードのみを有効にします。

-C-

コメントをネストさせることはできません。

-i32

識別子は最大 32 文字まで有効です。

-p-

C の呼び出し規約を使用します。

-w-

すべての警告を無効にします。

-wbei

初期化が不適切な場合の警告を有効にします。

-wbig

定数が大きすぎる場合の警告を有効にします。

-wcpt

ポインタ比較に互換性がない場合の警告を有効にします。

-wdcl

型や記憶クラスを指定しないで宣言した場合の警告を有効にします。

-wdup

同一でないマクロ定義が重複している場合の警告を有効にします。

-wext

external と static の両方を指定して変数が宣言された場合の警告を有効にします。

-wfdt

typedef を使って関数を定義した場合の警告を有効にします。

-wrpt

ポインタ変換に互換性がない場合の警告を有効にします。

-wstu

構造体が未定義である場合の警告を有効にします。

-wsus

ポインタ変換が間違っている可能性がある場合の警告を有効にします。

-wucp

signed char と unsigned char のポインタが混在している場合の警告を有効にします。

-wvrt

void 関数が値を返している場合の警告を有効にします。


ここで特に取り上げていないオプションは、自由に設定することができます。


2.1.2.2.1 main の引数のセマンティクス

プログラムを DOS 上で実行したとき、argv[0] はプログラム名を指します。 残りの argv 文字列は、DOS コマンドライン引数の各要素を指します。引数を区切っているホワイトスペースは削除され、ホワイトスペースを含まない一連の連続する文字群がそれぞれ 1 つの引数とみなされます。引用符の付いた文字列は、正しく(つまりスペースを含む 1 つの文字列として)扱われます。

2.1.2.3 対話型デバイスに含まれるもの

対話型デバイスとは、コンソールに似たデバイスのことです。

2.2.1 実行文字セットの照合順序

実行文字セットの照合順序には、ASCII の文字の値が使用されます。

2.2.1 ソース文字セットと実行文字セットに含まれるもの

ソース文字セットおよび実行文字セットは、IBM PC がサポートする拡張 ASCII セットです。Ctrl+Z 以外の文字はどれも、文字列リテラルや文字定数やコメントの中で使用することができます。

2.2.1.2 マルチバイト文字

Appmethod C++ ではマルチバイト文字をサポートしています。

2.2.2 印刷方向

PC の通常の方向と同じで、左から右に印刷されます。

2.2.4.2 実行文字セットの 1 つの文字のビット数

実行文字セットでは 1 文字が 8 ビットです。

3.1.2 識別子の中の先頭からの有効文字数

有効なのは最初の 32 文字ですが、コマンドライン オプション(–i)を指定すると、この数を変更することができます。内部識別子でも外部識別子でも、有効文字数は同じです (C++ 識別子の有効文字数には制限がありません)。

3.1.2 外部識別子での大文字/小文字の区別が有効かどうか

このコンパイラを使用すると、通常はリンカで大文字と小文字が区別されます。コマンドライン オプション(–lc–)を指定して、大文字/小文字の区別を無効にすることができます。

3.1.2.5 さまざまな整数型の内部表現と値セット

最小値 最大値

signed char

–128

127

unsigned char

0

255

signed short

–32,768

32,767

unsigned short

0

65,535

signed int

–2,147,483,648

2,147,483,647

unsigned int

0

4,294,967,295

signed long

–2,147,483,648

2,147,483,647

unsigned long

0

4,294,967,295


char 型はどれも、8 ビットからなる 1 バイトを格納用に使用します。 short 型はどれも、2 バイトを使用します。 int 型はどれも、4 バイトを使用します。 long 型はどれも、4 バイトを使用します。 アラインメントを行うよう指定された場合(–a)、char 以外の整数型オブジェクトはどれも、偶数バイト境界でアラインメントされます。指定されたアラインメントが –a4 の場合は、4 バイト境界でアラインメントされます。文字型がアラインメントされることはありません。

3.1.2.5 さまざまな浮動小数点型の内部表現と値セット

すべての Appmethod C++ 浮動小数点型で、Intel 8086 で使われている IEEE 浮動小数点形式が使われています。float 型では、32 ビット IEEE 実数形式を使用します。double 型では、64 ビット IEEE 実数形式を使用します。long double 型では、80 ビット IEEE 拡張実数形式を使用します。

3.1.3.4 ソース文字セットと実行文字セットのマッピング

文字列リテラルや文字定数に含まれる文字はどれも、プログラムの実行中に変化することはありません。ソース文字セットと実行文字セットは同じです。

3.1.3.4 基本実行文字セットやワイド文字定数用拡張文字セットで表現されない文字やエスケープ シーケンスを含む整数文字定数の値

ワイド文字がサポートされています。

3.1.3.4 ワイド文字定数用に、マルチバイト文字をそれに対応するワイド文字に変換するための現在のロケール

ワイド文字定数は認識されます。

3.1.3.4 複数の文字を含む整数定数や複数のマルチバイト文字を含むワイド文字定数の値

文字定数は、1 つまたは 2 つの文字を含むことができます。2 文字が含まれる場合、1 文字目が定数の下位バイトに、2 文字目が上位バイトになります。

3.2.1.2 整数をそれよりも短い符号付き整数に変換したり、符号なし整数を同じ長さの符号付き整数に変換したときに、その値が表現できない場合の結果

そのような変換では、単純に上位ビットが切り捨てられます。符号付き整数は 2 の補数値として格納されるため、変換結果の数値はそのような値として解釈されます。小さい方の整数の上位ビットが 0 以外であれば、値は負の値であると解釈され、0 であれば、正の値であると解釈されます。

3.2.1.3 元の値を正確に表現できない浮動小数点数に整数を変換した場合の切り捨ての方向

整数値は、最も近い表現可能な値に丸められます。たとえば、long の 2^31 -1 という値を float に変換すると 2^31 という値になります。IEEE 標準の算術規則に則って関係は切られます。

3.2.1.4 浮動小数点数をそれよりも範囲の狭い浮動小数点数に変換した場合の切り捨てまたは丸めの方向

値は、最も近い表現可能な値に丸められます。IEEE 標準の算術規則に則って関係は切られます。

3.3 符号付き整数に対するビット演算の結果

ビット演算子を符号付き整数に適用すると、対応する符号なしの型と同様の演算が行われます。符号ビットは通常のデータ ビットとして扱われます。その結果は、通常の 2 の補数の符号付き整数として解釈されます。

3.3.2.3 別の型のメンバを使って共用体オブジェクトのメンバにアクセスした場合の結果

アクセスは可能であり、別の型のメンバはそこに格納されているビットにアクセスします。別のメンバを使って浮動小数点型のメンバにアクセスする方法を理解するには、浮動小数点値がどのようにビットで表現されているかを詳しく理解する必要があります。値にアクセスするために使われたメンバよりも格納されているメンバの方が短い場合、余分のビットには、短い方のメンバが格納されている前にある値が含められます。

3.3.3.4 配列の最大サイズを保持するために必要な整数型

通常の配列では unsigned int 型、長い配列では signed long 型です。

3.3.4 ポインタと整数の間でのキャストの結果

同じサイズの整数とポインタの間で変換を行った場合、どのビットも変更されません。長い型をそれよりも短い型に変換すると、上位ビットが切り捨てられます。短い整数をそれよりも長いポインタ型に変換する場合には、まず整数が、ポインタ型と同じサイズの整数型に拡大変換されます。 そのため、符号付き整数の場合は、符号拡張で新しいバイトが埋められます。同様に、小さいポインタ型をそれよりも大きい整数型に変換する場合には、まずポインタ型が、整数型と同じサイズのポインタ型に拡大変換されます。

3.3.5 整数除算の剰余の符号

どちらか一方のオペランドだけが負である場合には、剰余の符号は負になります。オペランドの両方が負でないか両方が負である場合には、剰余は正になります。

3.3.6 同じ配列内の要素を指す 2 つのポインタの差 ptrdiff_t を保持するために必要な整数型

signed int 型です。

3.3.7 負の符号付き整数型の右シフトの結果

負の符号付き値を右シフトすると、符号拡張されます。

3.5.1 register 記憶クラス指定子を使って実際にレジスタ内に置くことのできるオブジェクトの範囲

1 バイト、2 バイト、4 バイトの整数またはポインタ型として宣言されたオブジェクトは、レジスタ内に置くことができます。少なくとも 2 つ、最大で 7 つのレジスタが利用可能です。実際にいくつのレジスタが使われるかは、関数の一時的な値を格納するためにどれだけのレジスタが必要かによって左右されます。

3.5.2.1 単純な int ビット フィールドを signed int と unsigned int のどちらのビット フィールドとして扱うか

単純な int ビット フィールドは 、signed int ビット フィールドとして扱われます。

3.5.2.1 int 内でのビット フィールドの割り当て順序

ビット フィールドは、下位のビット位置から上位のビット位置へと割り当てられます。

3.5.2.1 構造体メンバのパディングとアラインメント

デフォルトでは、構造体のパディングは行われません。ワード アラインメント オプション(–a)を指定している場合、構造体は偶数サイズにパディングされ、文字型や文字配列型でないメンバはどれも偶数のオフセットにアラインメントされます。

3.5.2.1 ビット フィールドが記憶単位の境界をまたぐことは可能か

全般的なアラインメントや型のアラインメントによっては、ビット フィールドが記憶単位をまたぐことが許されます。

3.5.2.2 列挙型の値を表現するために使われる整数型

列挙子はすべて、完全な int として格納されます。値が int に収まらない場合には、列挙型は long または unsigned long に格納されます。これは、–b コンパイラ オプションで指定されているデフォルトの動作です。 –b- の動作では、値を表現できる最も小さい整数型に列挙型を格納するよう指定されています。これには、signed charunsigned charsigned shortunsigned shortsigned intunsigned intsigned longunsigned long など、すべての整数型が含まれます。

C++ に準拠するためには –b- を指定する必要があります。C++ ではすべての列挙型を int として格納することは正しくないためです。

3.5.3 volatile 修飾子の付いた型のオブジェクトに対するアクセスが行われる場合

volatile オブジェクトを参照するたびに、そのオブジェクトに対するアクセスが行われます。隣接するメモリ上の位置にアクセスしたときにオブジェクトへのアクセスが行われるかどうかは、ハードウェア上でのメモリ構成に左右されます。ビデオ ディスプレイ メモリなどの特殊なデバイス メモリでは、デバイスの構成に左右されます。通常の PC メモリでは、volatile オブジェクトは非同期割り込みでアクセスされるメモリでのみ使用されるため、隣接するオブジェクトにアクセスしても影響はありません。

3.5.4 算術型、構造体型、共用体型を変更できる宣言子の最大数

宣言子の数に明確な制限はありません。認められている宣言子の数はかなり多いのですが、関数内のブロックに深くネストさせた場合には宣言子の数は減らされます。ファイル レベルで、少なくとも 50 は認められています。

3.6.4.2 switch 文の case 値の最大数

switch 文の case の数に明確な制限はありません。case の情報を保持できるだけの十分なメモリがある限り、コンパイラで問題は起きません。

3.8.1 条件付きインクルードを制御する定数式に含まれる 1 文字の文字定数の値は、実行文字セットに含まれる同じ文字定数の値と一致するか。その文字定数が負の値になることはあるか

条件指令の中の定数も含めてすべての文字定数は、同じ文字セット(実行)を使用します。1 文字の文字定数は、文字型が符号付きの場合(デフォルトのままで –K が指定されなかった場合)に負になります。

3.8.2 インクルード可能なソース ファイルの検索方法

インクルード ファイル名が山かっこで囲まれていて、インクルード ディレクトリがコマンドラインで指定されている場合には、そのインクルード ディレクトリそれぞれの中でファイルを検索します。検索するインクルード ディレクトリの順序は次のとおりです。

  1. コマンドラインで指定されたディレクトリの中。
  2. BCC32.CFG で指定されたディレクトリの中。
  3. インクルード ディレクトリが指定されていない場合には現在のディレクトリのみを検索。

3.8.2 インクルード可能なソース ファイルの引用符付きの名前のサポート

インクルード可能なファイルの名前に引用符が付いている場合、ファイルは次の順序で検索されます。

  1. #include 文が含まれているファイルと同じディレクトリの中。
  2. そのファイルをインクルード(#include)しているファイルのディレクトリの中。
  3. 現在のディレクトリ。
  4. /I コンパイラ オプションで指定されたパス上。
  5. INCLUDE 環境変数で指定されたパス上。

3.8.2 ソース ファイル名の文字シーケンスのマッピング

インクルード ファイル名の中のバックスラッシュは、エスケープ文字ではなく、別個の文字として扱われます。文字の大文字/小文字は無視されます。

3.8.8 利用不可能な場合の _ _DATE_ _ および _ _TIME_ _ の定義

日付および時間は常に利用可能であり、オペレーティング システムの日付および時刻が使われます。

4.1.1 小数点文字

小数点文字はピリオド(.)です。

4.1.5 sizeof 演算子の型 size_t

size_t 型は符号なしです。

4.1.5 NULL マクロが展開される NULL ポインタ定数

NULL は、int の 0 か long の 0 に展開されます。いずれも 32 ビットの符号付き数です。

4.2 assert 関数の出力する診断情報と終了時の動作

出力される診断メッセージは "アサーションが失敗しました: ("ファイル名" の nn 行目)" であり、にはアサーションが失敗した式、ファイル名にはソース ファイル名、nn にはアサーションが行われた行番号が表示されます。

アサーション メッセージが表示された直後に abort が呼び出されます。

4.3 文字テスト関数および大文字/小文字のマッピング関数の処理系定義の部分

4.3.1 で述べる以外にはありません。

4.3.1 isalnum、isalpha、iscntrl、islower、isprint、isupper の各関数でテストされる文字セット

デフォルトの C ロケールでは ASCII の最初の 128 文字です。それ以外の場合には 256 文字すべてです。

4.5.1 定義域エラーの際に数値計算関数が返す値

IEEE NAN(非数値)です。

4.5.1 アンダーフロー範囲エラーの際に数値計算関数が整数型の式 errno を ERANGE マクロの値に設定するかどうか

設定しません。設定するのは、定義域エラー、単一性エラー、オーバーフロー エラー、全体的な精度の低下といった他のエラーの場合のみです。

4.5.6.4 fmod 関数の第 2 引数に 0 が指定された場合に定義域エラーが起きるか 0 が返されるか

fmod(x,0) は 0 を返します。

4.7.1.1 signal 関数が対応しているシグナル

SIGABRT、SIGFPE、SIGILL、SIGINT、SIGSEGV、SIGTERM です。

4.7.1.1 signal 関数が認識する各シグナルのセマンティクス

signal(C RTL)」の説明を参照。

4.7.1.1 signal 関数が認識する各シグナルのデフォルトの処理とプログラム起動時の処理

signal(C RTL)」の説明を参照。

4.7.1.1 シグナル ハンドラを呼び出す前に signal(sig, SIG_DFL); に相当するものが実行されなかった場合に実行されるシグナルのブロック

signal(C RTL)(sig, SIG_DFL) に相当するものは必ず実行されます。

4.7.1.1 signal 関数に指定されたハンドラが SIGILL シグナルを受け取った場合にデフォルトの処理がリセットされるかどうか

リセットされません。

4.9.2 テキスト ストリームの最終行に終わりを示す改行文字が必要かどうか

必要ありません。

4.9.2 改行文字の直前にテキスト ストリームに書き出されたスペース文字は読み込んだときに現れるかどうか

現れます。

4.9.2 バイナリ ストリームに書き込んだデータの末尾に追加される NULL 文字の数

1 つも追加されません。

4.9.3 追加モードのストリームのファイル位置指示子の初期位置はファイルの先頭と末尾のどちらか

追加モードのストリームのファイル位置指示子は、最初はファイルの先頭に置かれます。書き込みを行う前に、毎回、ファイルの末尾にリセットされます。

4.9.3 テキスト ストリームに書き込みをすると対応するファイルのその箇所以降が切り捨てられるかどうか

0 バイトの書き込みによってファイルが切り捨てられるかどうかは、ファイルのバッファリングの方法に左右されます。長さが 0 の書き込みの動作は不確定であると考えておくのが安全です。

4.9.3 ファイルのバッファリングの特徴

ファイルは、完全バッファリングを行うことも、行バッファリングを行うことも、バッファリングを行わないこともできます。ファイルのバッファリングを行う場合には、ファイルを開いたときにデフォルトの 512 バイトのバッファが作成されます。

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

存在します。

4.9.3 同じファイルを何回も開くことができるかどうか

できます。

4.9.4.1 開いているファイルに remove 関数が及ぼす影響

ファイルが既に開かれているかどうかの特別な確認は行われないため、プログラマが責任を持たなければなりません。

4.9.4.2 rename を呼び出す前に既に新しい名前のファイルが存在している場合の影響

rename は -1 を返し、errno が EEXIST に設定されます。

4.9.6.1 fprintf における %p 変換の出力

出力は、8 桁の 16 進数(XXXXXXXX)であり、0 で埋められ、大文字が使われます(%08lX と同じです)。

4.9.6.1 fscanf における %p 変換の入力

4.9.6.1 セクションを参照。

4.9.6.2 fscanf における %[ 変換用スキャンリストの最初の文字でも最後の文字でもない -(ハイフン)文字の解釈

scanf」の説明を参照。

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

EBADF(ファイル番号が不正)です。

4.9.10.4 perror が生成するメッセージ

Arg list too big(引数リストが大きすぎる)

Attempted to remove current directory(現在のディレクトリを削除しようとした)

Bad address(アドレスが不正)

Bad file number(ファイル番号が不正)

Block device required(ブロック デバイスが必要)

Broken pipe(パイプが破損している)

Cross-device link(デバイス間リンク)

Error 0(エラー 0)

Exec format error(実行形式エラー)

Executable file in use(実行可能ファイルが使用中)

File already exists(ファイルが既に存在する)

File too large(ファイルが大きすぎる)

Illegal seek(シークが無効)

Inappropriate I/O control operation(入出力制御操作が不適切)

Input/output error(入出力エラー)

Interrupted function call(関数呼び出しが割り込まれた)

Invalid access code(アクセス コードが無効)

Invalid argument(引数が無効)

Invalid data(データが無効)

Invalid environment(環境が無効)

Invalid format(形式が無効)

Invalid function number(関数番号が無効)

Invalid memory block address(メモリ ブロック アドレスが無効)

Is a directory(ディレクトリである)

Math argument(数学引数)

Memory arena trashed(メモリ領域が破壊された)

Name too long(名前が長すぎる)

No child processes(子プロセスがない)

No more files(これ以上ファイルがない)

No space left on device(デバイスに空き領域がない)

No such device(指定されたデバイスがない)

No such device or address(指定されたデバイスまたはアドレスがない)

No such file or directory(指定されたファイルまたはディレクトリがない)

No such process(指定されたプロセスがない)

Not a directory(ディレクトリでない)

Not enough memory(メモリ不足)

Not same device(デバイスが異なる)

Operation not permitted(操作が許可されていない)

Path not found(パスが見つからない)

Permission denied(アクセスが拒否された)

Possible deadlock(デッドロックの可能性)

Read-only file system(読み取り専用ファイル システム)

Resource busy(リソースが使用中)

Resource temporarily unavailable(リソースが一時的に使用不可能)

Result too large(結果が大きすぎる)

Too many links(リンクが多すぎる)

Too many open files(開いているファイルが多すぎる)


4.10.3 要求されたサイズが 0 の場合の calloc、malloc、realloc の動作

callocmalloc は要求を無視して 0 を返します。realloc はブロックを解放します。

4.10.4.1 開かれた一時ファイルに関する abort 関数の動作

ファイル バッファはフラッシュされず、ファイルは閉じられません。

4.10.4.3 引数の値が 0、EXIT_SUCCESS、EXIT_FAILURE 以外である場合に exit が返す状態

特別なものは返されません。渡されたそのままの状態が返されます。状態は signed char として表現されます。

4.10.4.4 getenv が使用する環境名のセットと環境リスト変更用メソッド

環境文字列は、SET コマンドを使ってオペレーティング システムで定義されたものになります。putenv を使用すると現在のプログラムが実行されている間だけ文字列を変更することができますが、環境文字列を恒久的に変更するには SET コマンドを使用する必要があります。

4.10.4.5 system 関数の文字列の内容と実行モード

文字列はオペレーティング システムのコマンドと解釈されます。COMSPEC または CMD.EXE が使われ、引数の文字列は実行対象のコマンドとして渡されます。オペレーティング システムの組み込みコマンドや、バッチ ファイル、実行可能プログラムを実行することができます。

4.11.6.2 strerror が返すエラー メッセージ文字列の内容

4.9.10.4 セクションを参照。

4.12.1 ローカルのタイム ゾーンと夏時間

ローカルの PC の日時として定義されます。

4.12.2.1 clock の経過時間

プログラムの実行開始時を起点とするクロック刻みとして表されます。

4.12.3.5 日付と時間の形式