Compaq Cでは,ANSI規格のCに対するいくつかのVAX Cの機能拡張をサポートします。 これらの拡張は,コンパイル・コマンド行でVAX C互換性オプションを使用した場合にだけ認識されます。VAX C の拡張機能により, Compaq Cコンパイラを使用して,当初はVAX C コンパイラ用に記述されたコードをコンパイルすることができます。
以降の各節で,VAX C互換性オプション指定時に利用可能なVAX Cの拡張について説明します。ANSI 規格のC言語に対する拡張は,次の2つのカテゴリに分けられます。
float へのポインタは,
int へのポインタと互換性があります。
#module命令が許されます。Tru64
UNIXシステムでは,この命令は警告メッセージを出して無視されます。
#dictionary命令が許されます。Tru64
UNIXシステムでは,この命令は警告メッセージを出して無視されます。
#include
が許されます。Tru64 UNIXシステムでは,この命令のモジュール形式はエラーを生じます。
int を指定することは,signed
int を指定することと同等です。
main_programオプションを使用して,特定の関数を所定のプログラムのmain
関数として識別することができます。
VAX Cモードでコンパイルする場合,プログラム内でmain関数を指定するもうひとつの方法として, 次のオプションを関数定義に組み込むことができます。
main_program
このオプションはキーワードではなく,大文字でも小文字でも記述することができます。
main_programオプションは,メイン・
プログラムに main 以外の名前を許す場合に役立ちます。
プロトタイプ形式の関数定義では,次の例に示すように関数宣言部と左中括弧の間に
main_program を組み込みます。
char lower(int c_up)
main_program
{
.
.
.
}
旧形式の関数定義では,次の例に示すように,プロトタイプ形式と同じ場所ですが,
仮引数宣言の前に main_
program を組み込みます。
char lower(c_up)
main_program
int c_up;
{
.
.
.
}
どちらの例も,lower関数をmain関数として設定します。
実行は,関数のリンク順に関係なく,そこから始まります。
enum,short,char,
および long があります。ANSI C
規格では int,unsigned int,
または signed int だけが許されます。
struct型または2つの
union型は,サイズが同じ場合には同じ型とみなされます。
static記憶域クラスでの関数のブロック・レベルの宣言が許されます。
register記憶域クラスの指定された変数のアドレスを取得することが許されます。
main()関数の3番目の実引数,すなわち
char *envp[] が許されます。
Compaq CをVAX C互換性モードで実行する場合,
main関数は3番目の仮引数である
envp環境配列を受け入れることができます。この配列には,
ユーザ名などのプロセス情報と制御情報が含まれ,コマンド行から渡す実引数とは無関係です。
主に,exec および
getenvライブラリ関数の呼出し時に使用されます
[1]。
使用しているホスト環境で main関数を呼び出すための詳細については,
プラットフォームに固有のCompaq Cのマニュアルを参照してください。
long float は
double の同義語と認識されます。
[1] main()関数の仮引数は,厳密なANSIモードでのみ検査される。
unsigned
char および unsigned
short は unsigned int
へ拡張します。
##演算子のように動作します。生成されたトークンが有効ではない場合には,
マクロ置換並び中のコメントは削除されます。
変形構造体および共用体宣言を使用すると,中間構造体または共用体識別子を参照しなくても, ネストした集合体のメンバを参照することができます。 変形構造体または共用体宣言を別の構造体または共用体宣言の中にネストすると, ネストされた変形集合体は別の集合体として存在せず, Compaq Cはそのメンバを外側の集合体にコピーします。
変形構造体および共用体の宣言は,variant_struct
および variant_unionキーワードを使用して行います。
これらの宣言の形式は,次の点を除いて通常の構造体または共用体の形式と同じです。
変形構造体または共用体の初期化は,通常の構造体または共用体の初期化と同じです。
VAX C互換性オプションを使用した場合,代入演算における2つの構造体または共用体はサイズが同じであればよく, メンバおよびメンバ型が同じである必要はありません。
次の例は,変形構造体宣言の形式と変形構造体のメンバへの参照方法を示しています。
#include <stdio.h>
enum packet_type {TEXT, INTEGER};
/* This structure can contain either a text_packet or an integer value.
It can only contain one of these at a time, since they share the same
storage. */
struct packet
{
enum packet_type type;
variant_union
{
variant_struct
{
int str_size;
char *text;
} text_packet;
variant_struct
{
int value;
} value_packet;
} text_or_int;
} packet = {TEXT, 24 ,"I love the color purple"};
main()
{
if (packet.type == TEXT)
printf(" %s. \n",packet.text);
else
printf(" %d \n", packet.value);
packet.type = INTEGER;
packet.value = 42;
printf(" The meaning of life, the universe, and everything is: %d. \n",
packet.value);
}