ほとんどの 16 ビット プロテクト モード API は、パラメーターとして far ポインターを受け取りました。far ポインターは、16 ビットのオフセット (下位ワード) と 16 ビットのセレクター (上位ワード、セレクターはセグメントを参照) の両方を含む 32 ビットの値です。他のパラメーターと同様に、スタックに置くことで値渡しされます。通常、これらのポインタは最大 65536 バイトのメモリ領域しか参照できませんでしたが、別の far ポインタは別のメモリ領域を参照でき、64K を超えるメモリを使用できました。
たとえば、16 ビット Windows API (Win16) では、関数GetClientRectには次の文書化されたインターフェイスがありました。
void GetClientRect(hwnd, lprc)
HWND hwnd; /* handle of window */
RECT FAR* lprc; /* address of structure for rectangle */
シンボルは、16 ビット Windows API の使用時にキーワードにFAR
展開されるマクロでした。far
現在、この API 関数はLPRECT
、「RECT への長い (遠い) ポインター」として読み取られることを意図したパラメーターを取るものとして文書化されています。シンボルは、32 ビットおよび 64 ビット Windows APILPRECT
の typedef として定義されています。16 ビット API がまだサポートされている場合は、それを使用するときRECT *
の typedef になります。RECT far *
far
ポインター (および関数自体) でキーワードを使用しているため、すべてのメモリ モデルから API にアクセスできたため、メモリ モデル (小、中、コンパクト、大) ごとに個別の API はありませんでした。コンパイラは、それが far ポインターを受け取ったことを確認し、必要に応じて Near (16 ビット) ポインターをプロモートします。