B ANSI規格準拠の概要

Compaq CはX3J11技術委員会が規定し,『American National Standard for Information Systems- Programming Language C』(文書番号:X3.159-1989)に文書化されたプログラミング言語C のANSI規格に準拠しています。Compaq Cは, ANSI規格準拠に関するPlum-Hallテストをパスしました。厳密なANSI C規格モードでは, Compaq CコンパイラはANSI C規格のセクション1.7 準拠に次のように記述されている規格準拠の処理系です。

規格準拠のホスト処理系は,厳密な規格準拠のプログラムをすべて受け入れるものとする。 規格準拠の処理系は,言語の拡張が厳密な規格準拠のプログラムの動作を変えないという条件で( 追加のライブラリ関数を含めて) 拡張機能を持つことができる。」

ANSI C規格では,厳密な規格準拠のプログラムを次のように定義しています。

厳密な規格準拠のプログラムは,この規格に規定された言語およびライブラリの機能だけを使用するものとする。 同プログラムは未指定, 未定義,または処理系定義の動作に依存する出力を生成してはならず, 最小の処理系の限界を超えてはならない。」

「処理系には,すべての処理系定義の特性および拡張を定義したドキュメントが伴うものとする。 」

ANSI C規格はほとんどの言語定義と同様に,1つの処理系で利用可能なC言語の定義全体を含むものではありません。 弊社が現在サポートしているC の処理系には,ANSI C規格では定義されていない多数の機能が組み込まれています。

この節では,コンパイラの機能をANSI C規格の概要を反映する形式で説明します。 各見出しの後ろの括弧内に,関連するANSI C規格のセクション番号を示しています。 説明にANSI C規格の見出しが省略されている場合は, Compaq Cが規格に厳密に準拠しており,拡張または処理系定義の動作がないことを示します。

以降の各節には,Compaq C言語の拡張部分と処理系定義の部分だけを記述しています。 この節は,ANSI C規格とともにC言語のCompaq C処理系を完全に規定します。 この付録では,ANSI C規格を単に「規格」と呼びます。

B.1 診断(§2.1.1.3)

診断メッセージは,規格に規定されている構文規則または制約の最初の違反に対して生成されます。 それ以降の違反は,以前の違反によって隠されない場合のみ報告されます。

B.2 ホスト環境(§2.1.2.2)

envp を含めて main()の実引数の意味は,プログラミング環境によって決まります。 main()の実引数についての詳細は,プラットフォームに固有の Compaq Cのマニュアルを参照してください。

B.3 多バイト文字(§2.2.1.2)

多バイト文字のコード化に使用するシフト状態は,ローカル・システムで利用可能な変換テーブルに依存します。 ローカル・システムの変換テーブルによりサポートされている場合は, 特定の文字集合はその言語によりサポートされます。

B.4 エスケープ・シーケンス(§2.2.2)

ソース文字集合の文字定数または文字列リテラル内の要素は,実行文字集合の要素へ直接マップされます。 規格に定義されているもの以外のエスケープ・ シーケンスは,警告の診断メッセージが出されて,バックスラッシュは無視されるため, 文字定数または文字列リテラルの値は,バックスラッシュが存在しない場合と同様になります。

B.5 翻訳限界(§2.2.4.1)

マシン・アーキテクチャとオペレーティング・システムに差異があるため, 翻訳限界はプラットフォームによって異なります。それ以外において翻訳限界は存在しません。

次の一覧は,Compaq Cで設定している限界のみを示しています。規格にあっても次の一覧には存在しない翻訳限界は, Compaq Cでは設定されていないものです。

Tru64 UNIXシステムの場合

OpenVMSシステムの場合

B.6 数量的限界(§2.2.4.2)

Compaq Cの数量的限界は,limits.h および float.h のヘッダ・ファイルに定義されています。 これらのヘッダ・ファイルには,以下の記述に合わせて設定された処理系定義の値が入っています。

ここに記述されていない限界については,規格に示されています。

B.7 キーワード(§3.1.1)

キーワード__inline__unaligned,および __restrict は,OpenVMS Alphaシステムおよび Tru64 UNIXシステム上でサポートされています。

VAX Cのキーワードはすべて,VAX Cモードでサポートされます。これらのキーワードには次のものがあります。

次のキーワードはTru64 UNIXシステム上では受け入れられますが, 警告が出されます。

Tru64 UNIXシステムでは,globaldef宣言と初期化された globalvalue宣言は外部宣言として扱われます。 globalref宣言と初期化されていない globalvalue宣言は,extern を宣言した場合と同様に扱われます。


注意
MAIN_PROGRAMオプションも,OpenVMS システムではVAX C互換性オプションで利用できます。

B.8 識別子(§3.1.2)

識別子にはドル記号($)を含めることができます。ただし,厳密なANSIモードでは警告が出されます。

Tru64 UNIXシステムにおいて外部結合を持つ識別子を指定する場合, 大文字と小文字は識別されます。

OpenVMSシステムでは,省略時の設定により外部結合を持つ識別子名はすべて大文字に変換されますが, これはコマンド行オプションで制御することができます。

B.9 識別子の結合(§3.1.2.2)

1つの翻訳単位内で同じ識別子が内部結合と外部結合の両方で現れた場合は, エラーが報告されます。

B.10 型(§3.1.2.5)

char型と signed char型は同じ値の表現とセットを持ちます。 ただし,unsigned のコンパイル時オプションを指定した場合には,char型と unsigned char型が同じ値の表現とセットを持ちます。

B.11 整数定数(§3.1.3.2)

コモンCおよびVAX Cモードでは,数字の8と9は有効な8進数字として許されますが, 警告メッセージが出されます。

B.12 文字定数(§3.1.3.4)

2つ以上の文字またはワイド文字を含む文字定数は,エラー検査のコンパイル・ オプションにより警告の診断メッセージが出され,整数値として格納されます。2 文字以上の文字定数は,コモンCとの互換性のために最終文字が最下位バイトで表現されます。 基本実行文字集合には存在しない,8 進または16進のエスケープ・シーケンスを含む整数文字定数の表現は,エスケープ・ シーケンスの8進数または16進数によって指定される値です。 その値は,unsigned のコンパイル時オプションが有効かどうかに応じて符号付きまたは符号なし char として解釈されます。

wchar_tワイド文字定数の型は unsigned int です。

B.13 文字列リテラル(§3.1.4)

同一の文字列リテラルは識別する必要がないと規格では規定されているため, 文字列リテラルを変更した場合の動作は定義されていません。したがって, 文字列リテラルまたはワイド文字列リテラルを変更すると,エラーになります。

B.14 演算子-複合代入(§3.1.5)

旧形式の複合代入演算子(=+,=-,=*,=/,=%など)は,規格には定義されていません [1]。したがって,式 =単項演算子 式 といった形式を持つ式では, =単項演算子 が以前は代入演算子と解釈されていましたが,=単項演算子 は現在では2つのトークン,すなわち代入演算子と単項演算子 とに解釈されます。

エラー検査オプションを指定した場合は,=-,=*,=&,=+ (空白が入らない) に対して警告メッセージが出され,この意味の変更を知らせます。エラー検査オプションを指定しない場合には, メッセージは出されません。


[1] 初期バージョンのCでは,複合代入演算子を定義された順(+=, -=,*=)ではなく,逆順(=+,=-,=*)で記述できた。この旧形式では,2番目の演算子が有効な単項演算子でもあったため, 複合代入演算子の構文が曖昧になった。

B.15 文字と整数-値保存拡張(§3.2.1.1)

初期バージョンのCでは,汎整数拡張規則の実現に対して2つの異なる方法が取られていました。 最初の方法は符号なし保存 と呼ばれ,unsigned char および unsigned short unsigned int へ拡張されます。2番目の方法は値保存 と呼ばれ,値を表現できる場合には unsigned char および unsigned short signed int へ拡張されます。 表現できない場合には unsigned int へ拡張されます。規格では,汎整数拡張は値保存であると規定されています。 コモンCおよびVAX Cモード以外のすべてのモードではこの方法に従っており, 符号なし保存の算術変換に依存するプログラムは別の方法で解釈されます。

符号なし保存規則に依存する算術変換を検索できるようにするため,値保存規則の影響を受けるような unsigned char および unsigned short から int への汎整数拡張には,エラー検査オプションを使用するとフラグが付けられます。

B.16 符号付き整数と符号なし整数の変換(§3.2.1.2)

符号付き整数へ縮小された整数の値が大きすぎて表現できない場合,結果は切り捨てられ, 余分の上位ビットは破棄されます。これは,コモンCおよびVAX C に互換性があります。

同じサイズの符号付き整数と符号なし整数の間の変換では,表現の変更はありません。

B.17 浮動小数点数と汎整数の変換(§3.2.1.3)

整数を浮動小数点数に変換して正確に表現できない場合,変換の結果は正確に表現できる最も近い値になります。 この結果はハードウェア上での変換の自然の結果であって, 元の値より大きくなったり小さくなったりすることがあります。

コンパイル時に浮動小数点数を整数または別の浮動小数点型に変換して結果を表現できない場合, コンパイラは診断メッセージを出します。

汎整数または倍精度浮動小数点数を浮動小数点数に変換して元の値を正確に表現できない場合, 結果は float型の最も近い値に丸められます。詳細については, 『MIPS R-Series Processor Architecture Manual』または『VAX Architecture Manual』など使用しているプラットフォームに固有のアーキテクチャ・ マニュアルを参照してください。

double値を float に縮小する際に, 変換する値が表現できる値の範囲にあるのに正確に表現できない場合, 結果は最も近い上位値または下位値になります。DEC Cでは,結果を最も近い表現可能な float値に丸めます。

同様の丸めは,long double から double または float へ縮小する際にも行われます。

B.18 ポインタ変換(§3.2.2.3)

たとえ2つの型が同じ表現であっても(int long のように),型はやはり異なります。 つまり,int へのポインタを long へのポインタに割り当てるには,キャスト演算子を使用しなければなりません。

この規則は,コモンCおよびVAX Cモードでは緩和されます。ポインタ変換では表現の変更はありませんが, 一部のマシンでは境界調整制約のため未調整のポインタによるアクセスは, アクセス時間の遅延,マシン例外,または予想できない結果を生じることがあります。

B.19 構造体および共用体メンバ(§3.3.2.3)

値を保持しているメンバとは異なる共用体メンバにアクセスした場合の結果は, メンバのデータ型とその共用体内での境界調整によって異なります。

B.20 sizeof演算子(§3.3.3.4)

sizeof演算子の型は size_t です。この型は配列の最大サイズを保持するために必要な整数の型ですが, Compaq Cはこの型を <stddef.h>ヘッダの中で unsigned int として定義しています。

B.21 キャスト演算子(§3.3.4)

ポインタは汎整数型に変換できると規格では規定していますが,必要な整数のサイズと結果は処理系定義です。 ポインタは,int型または long型(あるいはその unsigned の同値)のオブジェクトと同じ記憶量を占有します。 したがって,ポインタはこれらの整数型のいずれにも変換することができ, 値を変更せずに元に戻すことができます。スケーリングは行われず, 値の表現は変化しません。

ポインタと char などの短整数型の間の変換は, unsigned long型のオブジェクトと短整数型の間の変換と同様です。 ポインタの上位ビットは破棄されます。短整数とポインタの間の変換は, 短整数型と unsigned long の間の変換と同様です。短整数型が符号付きの場合,ポインタの上位ビットは符号ビットのコピーで充填されます。 エラー検査のコンパイル・ オプションを使用した場合には,これらの型のキャスト演算に対してメッセージが出されます。

B.22 乗除演算子(§3.3.5)

規格では,除算演算子および剰余演算子に移植可能な意味を与えていません。 Compaq Cでは次の意味に従います。

次のような未定義動作がコンパイル時に検出された場合,コンパイラは警告を出します。

B.23 加減演算子(§3.3.6)

同じ配列のメンバへのポインタで減算を行うことができます。結果は2 つの配列メンバの間の要素の数であり,結果の型は ptrdiff_t です。Compaq Cでは,この型を int と定義しています。

B.24 ビット単位のシフト演算子(§3.3.7)

E1 >> E2の結果は,E2ビット位置だけ右へシフトした E1 です。 E1 が符号付き型の場合,結果の値は空いた上位ビットに E1 の符号ビットのコピーが充填された E1 のシフト値です(算術シフト)。

B.25 記憶域クラス指定子(§3.5.1)

register記憶域クラス指定子は,オブジェクトへのアクセスをできるだけ速く行うように指定します。 register の指定は,変数をレジスタに格納する確率を高くするために行われます。 ただし,コンパイラのレジスタ割当て技法により, register キーワードはもはや使用されなくなりました。 つまり,Compaq Cではすべての register 要求を受け入れて無視します。

B.26 型指定子(§3.5.2)

コモンCおよびVAX Cとの互換性のため,long float の組み合わせは double の同義語としてサポートされます。 ただし,省略時のモードまたは厳密なANSIモードでコンパイルした場合にこの組み合わせを使用すると警告が出されます。

B.27 構造体および共用体指定子(§3.5.2.1)

intビット・フィールドの最上位ビット位置は,VAX C 互換性モード以外では符号ビットとして扱われません。 つまり,int型はどのビット・フィールド型の場合も, unsigned int と同じ型であることを指定します。VAX C モードでは,int型はどのビット・フィールド型の場合も, signed int と同じ型であることを指定します。

B.28 変形構造体および共用体

変形構造体および共用体はVAX Cの拡張機能であり,ネストした構造体および共用体を外側の集合体のメンバとして宣言できます。 これにより,これらのメンバの参照時に中間修飾子を指定する必要がなくなります。 これらの機能は,VAX C モードでのみ利用可能です。

これらの拡張機能についての詳細は,プラットフォームに固有のDEC Cのマニュアルを参照してください。

B.29 構造体の境界調整

構造体の境界調整とサイズは,各プラットフォームにおける構造体の構成要素の境界調整条件とサイズの影響を受けます。 構造体はどのバイト境界からでも開始することができ, 整数バイト数であれば任意のバイト数を占有できます。 ただし,個々のアーキテクチャまたはオペレーティング・システムは, 特定の境界調整およびパディング条件(プラグマおよびコマンド行オプションで変更可能) を指定することがあります。

OpenVMS AlphaとTru64 UNIXの場合

OpenVMS AlphaおよびTru64 UNIXシステムでは,非ビット・ フィールドの構造体メンバは,省略時の設定では自然に境界調整されます。

省略時の構造体の境界調整は,構造体内の任意のメンバが必要とする最大の境界調整です。 構造体はサイズ(バイト単位)が境界調整条件の倍数になるようにパッドされて, 構造体または共用体が配列のメンバである場合に適切な境界調整が行えるようにします。

構造体の構成要素は,宣言された順にメモリ内に格納されます。最初の構成要素は構造体全体と同じアドレスです。 構成要素間にパディングを挿入して, 個々の構成要素の境界調整条件を満たします。

ビット・フィールドはどんな汎整数型でも構いません。ただし,型が intunsigned int,または signed int 以外の場合に,コンパイラはエラー検査オプション指定時には警告を出します。 ビット・フィールドが存在すると, 構造体または共用体全体の境界調整は少なくともビット・フィールドの基本型の境界調整と同じになります。

他のビット・フィールドの直後に宣言されないビット・フィールド(長さ0 のビット・フィールドを含む)では,境界調整条件はその基本型が課したものとなります。 ビット・フィールドは,(ビット・フィールドの基本型と同じサイズの) 境界調整単位内で下位から上位へ割り当てられます。

#pragma member_alignmentが有効に設定されていると,あるビット・フィールドが別のビット・ フィールドの直後に続くとき,十分な領域が残っている場合にはそのビットは同じ単位内の隣接する領域へパックされます。 十分な領域が残っていない場合には最初のビット・フィールドの終わりにパディングが挿入され,2 番目のビット・フィールドは次の単位へ置かれます。

#pragma nomember_alignmentが有効に設定されていると,ビット・フィールドは記憶域単位境界にまたがることができます。Alpha システムでは省略時にはmember_alignment に設定され,VAXシステムでは省略時にはnomember_alignment に設定されます。

char基本型のビット・フィールドは,8ビット以上でなければなりません。 short 基本型のビット・フィールドは,16ビット以上でなければなりません。

OpenVMS VAXの場合

OpenVMS VAXシステムでは,構造体または構造体メンバを特定の境界に調整する必要はなく, 非ビット・フィールド構造体メンバは特に指定しない限りバイトで調整されます。

構造体の構成要素は,宣言された順にメモリ内に格納されます。最初の構成要素は構造体全体と同じアドレスです。 各構成要素は,それぞれ前の構成要素の直後に次々に格納されます。

次のプラグマを使用すると,構造体メンバを通常の境界調整にすることができます。

             #pragma member_alignment

Compaq C for OpenVMSシステム ユーザーズ・ガイド』には,OpenVMS VAX上における構造体の境界調整の例と図が掲載されています。

ビット・フィールドはどの汎整数型でも構いません。 ただし,/STANDARD= ANSI89が指定され,型が intunsigned int,または signed int 以外の場合にはコンパイラは警告を出します。 ビット・フィールドは,単位内で下位から上位へ割り当てられます。 あるビット・フィールドが別のビット・フィールドの直後に続く場合は, たとえそれが別のバイトへオーバフローしてもそのビットは隣接する領域へパックされます。 ただし,名前のないビット・フィールドを長さ0 と指定した場合には,直後のビット・フィールドが次のバイト境界から始まるようにパディングが挿入されます。

Compaq C for OpenVMSシステム ユーザーズ・ガイド』に,OpenVMS VAX上におけるビット・ フィールドの境界調整の例と図が掲載されています。

B.30 列挙型指定子(§3.5.2.2)

規格では,列挙型はそれぞれ処理系定義の整数型と互換性があることを規定しています。 Compaq Cでは,列挙型はそれぞれ signed int型と互換性があります。

B.31 型修飾子(§3.5.3)

volatile記憶域クラスは,コンパイラに未知の方法で変更できる変数に対して指定されます。 したがって,あるオブジェクトがvolatile と宣言された場合,ソース・コードでこのオブジェクトを参照するたびにオブジェクト・ コードでメモリを参照することになります。

B.32 宣言子(§3.5.4)

算術型,構造体型,共用体型,または不完全型を変更できるポインタ,関数, または配列宣言子の数に内部限界はありません。

B.33 初期化(§3.5.7)

Cでは,論理的に必要ではない場合にも初期化子を中括弧 { } で囲むことができます。これにより,部分的に無視される中括弧を持つ集合体の初期化子は, 実現されたパーサの型に応じて異なる方法で解析されます( ボトムアップまたはトップダウン)。規格では,Kernighan とRitchieの『The C Programming Language, 2nd Edition』の中で初めて指定されたトップダウンを指定しています。 部分的に中括弧で囲まれた初期化子がボトムアップ解析( コモンC解析)に依存するプログラムは,予想外の結果を生じることがあります。 この構成要素は許されてはいますが,コモンCモード, またはエラー検査オプションを使用した場合には警告メッセージが出され, 中括弧が無視されることを通知します。

B.34 switch文(§3.6.4.2)

switch文中の caseラベルの数に制限はありません。

B.35 外部オブジェクト定義(§3.7.2)

コモンCモードでは,すべての externオブジェクトはファイル・ スコープを持ちます。

B.36 条件付き取込み(§3.8.1)

以前のプリプロセッサでは,次の例のように前処理命令の後に余分なテキストを記述することが許されていました。

             #endif system1

しかし規格では,前処理命令の後に許されるテキストはコメントだけであることが規定されています。 したがって,この構文規則に違反した場合, Compaq Cコンパイラは警告メッセージを出します。

#if および #elif命令内の文字定数の数値は, これらの命令の一部ではない式の中で同一の文字定数が使用されたときに得られた値と一致します。

B.37 ソース・ファイルの取込み(§3.8.2)

二重引用符で囲んだパス名(#include "stdio.h" )または山括弧で囲んだパス名( #include <stdio.h> )を使用して,ソース・ ファイルを取り込むことができます。また,OpenVMSシステムではテキスト・ ライブラリからモジュールを取り込む方法もサポートします。 ソース・ファイルを取り込むための検索パス・アルゴリズムについては, プラットフォームに固有のCompaq Cドキュメントを参照してください。

B.38 マクロ置換-あらかじめ定義されたマクロ名( §3.8.3)

規格であらかじめ定義されたマクロ名の他に,Compaq Cコンパイラではさまざまなシステム識別用に別の前処理マクロを定義しています。 コンパイラが起動されると, オペレーティング・システム,アーキテクチャ, 言語,コンパイラ・モード,および他の環境変数に従って,適切な識別マクロが定義されます。 これらのマクロは#ifdef前処理命令で参照すると, 特定の環境に適用するコードを分離することができます。

Compaq Cの各プラットフォームにはあらかじめ定義された追加のマクロがあるかもしれません。 詳細については,プラットフォームに固有の Compaq Cドキュメントを参照してください。

表 B-1に掲載している形式はすべて, 表示されたプラットフォーム上で定義されています。ただし,厳密なANSI モードが有効な場合には新しいつづりだけが定義されます。

表 B-1に示しているのは, Tru64 UNIX上であらかじめ定義されたマクロ名です。

表 B-1 Tru64 UNIX上であらかじめ定義されたマクロ名

マクロ名
オペレーティング・ システム名: unix
__unix__
__osf
SYSTYPE_BSD
_ SYSTYPE_BSD
アーキテクチャ名: __alpha
製品名: __DEC C
__DEC C_VER
LANGUAGE_ C
__LANGUAGE_ C__

表 B-2に示しているのは, OpenVMS VAXおよびAlphaシステム上であらかじめ定義されたマクロ名です。 厳密なANSIモードが有効になっていない場合に限りすべての形式が定義されます。 厳密なANSIモードが有効になっている場合には新しいつづりだけが定義されます。

表 B-2 OpenVMS VAXおよびAlpha上であらかじめ定義されたマクロ名

新しいつづり 従来のつづり
オペレーティング・システム名: __vms vms
__VMS VMS
__vms_version vms_version
__VMS_VERSION VMS_VERSION
アーキテクチャ名: __vax (VAX) vax (VAX)
__VAX (VAX) VAX (VAX)
__alpha (Alpha) -
__ALPHA (Alpha) -
__Alpha_AXP (Alpha) -
__32BITS (Alpha) -
製品名: __vaxc vaxc
__VAX C VAX C
__vax11c vax11c
__VAX11C VAX11C
__STDC__ -
__DEC C -
__DEC C_VER -
__VMS_V6_RTL_COMPAT -
コンパイラ・モード: __DEC C_MODE_STRICT -
__DEC C_MODE_RELAXED -
__DEC C_MODE_ VAX C -
__DEC C_MODE_COMMON -
浮動小数点: __D_FLOAT -
__G_FLOAT -
__IEEE_FLOAT (Alpha) -
__X_FLOAT (Alpha) -
その他: __HIDE_FORBIDDEN_NAMES -
__INITIAL_POINTER_ SIZE (Alpha) -

表 B-3に示すマクロを明示的に定義することにより, どのCライブラリ・ルーチンをヘッダ・ファイルで宣言するかを制御したり, 規格準拠チェックを行うことができます。これらのマクロを定義するには, 次のいずれかを使用します。

表 B-3 ライブラリ・ルーチン規格準拠マクロ- 全プラットフォーム

マクロ 規格
_XOPEN_SOURCE_EXTENDED XPG4-UNIX
_XOPEN_SOURCE XPG4
_POSIX_C_SOURCE POSIX
_ANSI_C_SOURCE ISO CおよびANSI C
_AES_SOURCE (Tru64 UNIX) アプリケーション環境サービス
_OSF_SOURCE (Tru64 UNIX) OSF互換性
_VMS_V6_SOURCE (OpenVMS) OpenVMSバージョン6 互換性
_DEC C_V4_SOURCE (OpenVMS) DEC Cバージョン4 互換性

B.39 ##演算子(§3.8.3.3)

マクロ置換並び内に ##演算子があると,演算子の両側の2 つのトークンが連結されて,単一のトークンになります。

コモンCおよびVAX Cの互換性モードでは,コメントはマクロ呼出し後に空文字列に置き換えられるため, コメントも2つのトークンを連結することができます。

厳密なANSIモードまたは省略時のモードでは,コメントは単一の空白に置き換えられるので, この動作はサポートされません。

B.40 エラー命令(§3.8.5)

#error命令はエラー・メッセージを出して,コンパイルを終了します。

B.41 プラグマ命令(§3.8.6)

規格が承認している言語に拡張機能を追加する方式は,プラグマを追加して行われます。 認識されないプラグマには情報メッセージで診断されます。 サポートされるプラグマはプラットフォームによって異なります。詳細については, プラットフォームに固有のCompaq Cドキュメントを参照してください。

ファイルの前処理だけを行う場合には,Compaq Cで認識されるすべてのプラグマは変更なしで出力へ書き込まれます。

B.42 関数のインライン展開

関数のインライン展開は,プロシージャ呼出しのオーバヘッドを排除して, 一般的な最適化方式を展開されたコードに適用することができます。 関数インラインがマクロに比べて優れている点は,実引数が1回だけ評価され, 優先順位の問題を避けるために括弧を多用する必要がなく, また,実際の展開をコマンド行から制御できることです。

次のプラグマを使用すると,関数のインライン展開を制御することができます。

     #pragma inline (関数名 [,関数名....])
     #pragma noinline (関数名 [,関数名....])

関数が inline命令の中で指定されたとき,その関数に次の特性がある場合には, この関数への呼出しはインライン・コードとして展開されます。

インライン関数の特性は次のとおりです。

B.43 結合プラグマ

Compaq Cは,OpenVMS Alphaシステム上において #pragma linkage および #pragma use_linkage 前処理命令をサポートします。

これらのプラグマは特殊な結合特性を定義する場合,およびこれらの結合特性を関数と関連付ける場合に使用します。 詳細については,プラットフォームに固有の Compaq Cのマニュアルを参照してください。

B.44 その他のプラグマ

次のプラグマは,VAX C互換性モードだけで提供されます。

             #pragma dictionary CDD_path
             #pragma module title ident

これらのプラグマは,#dictionary命令と #module命令にそれぞれ対応します。

システムでサポートされている追加のプラグマについては,プラットフォーム固有の Compaq Cマニュアルを参照してください。