_PTR_ 背后的理由是什么?

发布于 2024-12-05 05:49:26 字数 374 浏览 1 评论 0原文

我正在使用一个源库,对指针类型定义的规则对我来说不清楚:使用 _PTR_ 宏而不是 *。所以,所有的函数原型和 typedef 看起来都像:

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

我想知道这背后的基本原理是什么,因为对我来说这似乎太过分了。

编辑

顺便说一句,对于双重间接,我发现:

_io_strtod(char _PTR_, char _PTR_ _PTR_);

I am working with a source base with a unclear for me rule on pointer types definition: using _PTR_ macro instead of *. So, all the function prototypes and typedefs look like:

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

I wonder what could be the rationale behind this since for me this seems excessive.

EDIT

By the way, for double indirection I found:

_io_strtod(char _PTR_, char _PTR_ _PTR_);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

宁愿没拥抱 2024-12-12 05:49:26

这个定义可能是为了与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 将为 #define 为空。

尽管 DOS 早已成为过去,但一些现代嵌入式架构也存在类似的问题。对于哈佛架构处理器,指向程序和数据存储器的指针必须使用不同的指令来访问,因此它们具有不同的类型。其他处理器具有不同的“数据模型”,并且低于 2^24、2^16 或 2^8 的指针的特殊指针类型并不罕见。

It is possible that the definition is for compatibility with DOS.

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

The far / near keywords allow pointers to address memory inside / outside the current segment, allowing programs to address more than 64 KiB of memory while still keeping the benefits of 16 bit pointers for faster code / less memory usage.

It is more typical to exclude * from the definition. For example, in LibPNG, you can see definitions like:

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

On most platforms, FAR will be #defined to nothing.

Although DOS is long past, some modern embedded architectures have similar issues. For Harvard architecture processors, pointers to program and data memory must be accessed using different instructions, so they have different types. Other processors have different "data models", and it is not uncommon to see special pointer types for pointers below 2^24, 2^16, or 2^8.

陌伤浅笑 2024-12-12 05:49:26

这是一个很好的约定,可以轻松区分乘法和间接(对于足够小的定义)

int _PTR_ arr = malloc(42 * sizeof _PTR_ arr);

That's a good convention to easily (for sufficiently small definitions of easily) differentiate between multiplication and indirection

int _PTR_ arr = malloc(42 * sizeof _PTR_ arr);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文