2011-09-19 40 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

相關問題