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 回答