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