4

私は、ポインター型の定義に関するルールが不明なソースベースで作業しています: *の代わりに_ PTR _マクロを使用しています。したがって、すべての関数プロトタイプと typedef は次のようになります。

extern FILE_PTR    _io_fopen(const char _PTR_, const char _PTR_);

私にとってこれは過度に思えるので、これの背後にある理論的根拠は何だろうか.

編集

ちなみに、二重間接参照については、次のことがわかりました。

_io_strtod(char _PTR_, char _PTR_ _PTR_);
4

2 に答える 2

6

DOSとの互換性のための定義である可能性があります。

#ifdef DOS
#define _PTR_ far *
#else
#define _PTR_ *
#endif

far/キーワードを使用nearすると、ポインタが現在のセグメントの内側/外側のメモリをアドレス指定できるため、プログラムは64 KiBを超えるメモリをアドレス指定できると同時に、16ビットポインタの利点を維持してコードを高速化し、メモリ使用量を減らすことができます。

*定義から除外するのがより一般的です。たとえば、LibPNGでは、次のような定義を確認できます。

typedef png_color FAR * png_colorp;
typedef png_color FAR * FAR * png_colorpp;

ほとんどのプラットフォームでFAR#defined、何もありません。

DOSは古くからありますが、一部の最新の組み込みアーキテクチャにも同様の問題があります。ハーバードアーキテクチャプロセッサの場合、プログラムとデータメモリへのポインタは異なる命令を使用してアクセスする必要があるため、それらは異なるタイプになります。他のプロセッサには異なる「データモデル」があり、2 ^ 24、2 ^ 16、または2^8未満のポインタに特別なポインタタイプが表示されることは珍しくありません。

于 2011-09-19T14:52:10.950 に答える
0

これは、乗算と間接参照を簡単に(簡単に十分に小さい定義の場合)区別するための良い規則です。

int _PTR_ arr = malloc(42 * sizeof _PTR_ arr);
于 2011-09-19T14:52:44.650 に答える