2011-09-19 79 views
4

我的工作与源基地,以不清楚,我对指针类型定义规则:使用_ PTR _宏而不是*。所以,所有的函数原型和typedefs看起来像:_PTR_背后的理由是什么?

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

我不知道可能是什么原因背后,因为对我来说这似乎过分。

编辑

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

_io_strtod(char _PTR_, char _PTR_ _PTR_); 
+1

问得好区分。我真的很好奇,看看有没有人对这个问题有很好的回答。你是否也看到'__PTR__ __PTR__'双重间接? :S –

+3

大声笑...也许程序员提出了这个问题,它有视觉问题,难以识别典型源文件中所有其他符号中的小星号。 – pmg

+0

@Michael Mior哈哈 - 有:) – pmod

回答

6

这是可能的定义是与DOS的兼容性。

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

far/near关键字允许指针来解决内存内/当前段外,允许程序解决内存超过64个昆明植物研究所,同时仍保持的16位指针的好处了更快的代码/使用更少的内存。

从定义中排除*更为典型。例如,在libpng的,你可以看到的定义,如:

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

在大多数平台上,FAR#defined不了了之。

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

+0

嗯,也许,但我可以看到的是它是#define _PTR_ *和部分与平台相关的特定代码(代码不适用于在DOS下构建,实际上这是在RTOS内部)。所以,他们可能希望将代码保存到远处(ha = ha)未来...... – pmod

+0

@pmod:许多嵌入式体系结构都具有不同类型的指针,就像DOS一样,所以可以解释它。 –

+0

我不认为这个答案是有道理的。如果你想让所有指针远离DOS,你可以使用大型/大型内存模型。如果你只希望SOME指针远,那么调用宏_PTR_'没有意义... –

0

这是一个好习惯轻松(对于足够小的定义容易)乘法和间接

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

Eh,'int * arr'不显示像multiplication; D – Griwes

+0

不存在,@Griwes:在malloc参数中! '42 ** arr' =='42 * _PTR_ arr' =='42 * arr [0]' – pmg

+0

这就是为什么我总是在适当的位置添加空格......'42 *(* arr)'或'42 * * arr'更清晰,并且不涉及一些不可读的大写(丑陋)宏。如果你需要这样的表达式,使用'sizeof',只需使用'42 * sizeof(* arr)'... – Griwes