我正在使用一个源代码库,对我的指针类型定义规则不明确:使用 _ PTR _ 宏代替 * 。因此,所有函数原型和typedef看起来都像:
extern FILE_PTR _io_fopen(const char _PTR_, const char _PTR_);
我想知道这背后的理由是什么,因为对我来说这似乎过分了。
修改
顺便说一句,对于双重间接我发现:
_io_strtod(char _PTR_, char _PTR_ _PTR_);
答案 0 :(得分: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之下看到指针的特殊指针类型并不罕见。
答案 1 :(得分:0)
这是一个很好的约定,很容易(对于容易的小定义)区分乘法和间接
int _PTR_ arr = malloc(42 * sizeof _PTR_ arr);