【问题标题】:What is rationale behind _PTR_?_PTR_ 背后的基本原理是什么?
【发布时间】:2011-09-19 14:45:15
【问题描述】:

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

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

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

编辑

顺便说一下,我发现了双重间接:

_io_strtod(char _PTR_, char _PTR_ _PTR_);

【问题讨论】:

  • 好问题。我真的很想知道是否有人对此有一个好的答案。你也看到__PTR__ __PTR__ 用于双重间接吗? :S
  • 大声笑 ...也许提出这个问题的程序员有视力问题,并且难以识别典型源文件中所有其他符号中间的小星号。
  • @Michael Mior Ha-ha - 有:)
  • 呃。我想不出这样做的理性理由。他们是否也使用宏进行取消引用?例如,他们真的写了x = _PTR_p 之类的东西吗?他们会写int (_PTR_x)[N]char _PTR_(_PTR_foo)(void) 之类的声明吗?如果不是,那么我提交的宏是 worthless 并且应该被排除在外。如果您不能处理指针语法,请不要在 C 中工作。
  • 看起来只有吃蛋饼的 Pascal 程序员才能想出的东西..

标签: c pointers design-consideration


【解决方案1】:

这个定义可能是为了兼容 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 的指针,看到特殊的指针类型并不少见。

【讨论】:

  • 好吧,也许吧,但是我可以看到它是#define PTR * 并且部分代码与平台相关特定(代码不适用于在 DOS 下构建) ,实际上这是在 RTOS 内部)。所以,他们可能希望在遥远的(ha=ha)未来保持代码的可移植性......
  • @pmod:很多嵌入式架构都有不同类型的指针,就像 DOS,这样就可以解释了。
  • 我认为这个答案没有意义。如果您希望所有指针都远离 DOS,您将使用大/巨大内存模型。如果你只希望一些指针很远,那么调用宏_PTR_ 没有意义......
  • @R..:这是来自 LibPNG,它是一个库。他们可能需要所有的指针都很远,但他们不想强迫应用程序开发人员使用不同的内存模型。
  • 嗯,FAR 这个名字很有意义。此外,与_PTR_ 不同,它是有效的、可移植的 C。(_PTR_ 以下划线和大写字母开头,位于保留的命名空间中,因此无法使用)
【解决方案2】:

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

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

【讨论】:

  • 呃,int * arr 看起来不像乘法;D
  • 不存在,@Griwes:在 malloc 参数中!还有42**arr == 42*_PTR_ arr == 42*arr[0]
  • 这就是为什么我总是在适当的地方添加空格...42 * (*arr)42 * *arr 更清晰,不涉及一些不可读和大写(=丑陋)的宏。而sizeof,就用42 * sizeof(*arr),如果你需要这样的表达...
最近更新 更多