2010-05-05 52 views
20

我想知道爲什麼在某些源代碼中有像FAR和PASCAL這樣的宏。他們是什麼意思? 謝謝什麼是FAR PASCAL?

+10

他們調用時間機器,然後一個30歲的比爾蓋茨彈出並要求他回到640k。 – 2010-09-20 03:35:57

回答

19
  • PASCAL:它與calling convention有關。參數按照從左到右的順序(與cdecl相反)推入堆棧,被調用者負責在返回之前平衡堆棧。

    此調用約定在以下16位API中很常見:OS/2 1.x和Microsoft Windows 3.x. Borland Delphi 1.x是否使用它有一些爭議

  • FAR:在分段體系結構計算機中,far pointer是一個包含段選擇器的指針,可以指向當前段之外的地址。

爲了完整,FAR和PASCAL是prepreocessor宏,編爲16位系統時,擴大到了需要聲明調用約定和指針大小的關鍵字。在32位系統上,它們通常擴展到無(除非你有一個奇怪的默認調用約定)。這些宏被保留用於向後兼容{hat/tip:Comment from Adrian McCarthy}

+0

我很確定默認的Delphi調用約定一直是* register *。它只使用* pascal *函數從Windows API和其他DLL。 – 2010-05-05 14:49:47

+3

爲了完整性,'FAR'和'PASCAL'是預先宏,當爲16位系統編譯時,擴展爲聲明調用約定和指針大小所需的關鍵字。在32位系統上,它們通常擴展到無(除非你有一個奇怪的默認調用約定)。爲了向後兼容,這些宏被保留。 – 2010-05-05 17:17:12

3

FAR是從16位時代,當我們有近(16位)和遠(32位)指針保持。

PASCAL是一個調用約定。我相信現在相當於stdcall

9

通過內存怎麼回事,

FAR是回落到16位的天,當堆內存中被分割。 NEAR數據的大小和速度都有限,FAR允許更大但更昂貴。

據我所知,在32位的土地上,它是一個崩潰到無爲的宏。

PASCAL是一個調用約定,在16位時間內也大量使用。它已被替換爲stdcall。

兩者都保留爲了向後兼容。

1

這可能是16位時代剩下的一些冗餘/過時的編碼。

在16位應用程序中使用FAR來指示地址需要超過16位。 PASCAL(altion)是一種轉換類型,它可以讓編譯器知道如何安排堆棧(使用PASCAL調用約定),以便編譯器可以將適當的參數傳遞給函數以及從函數傳遞函數。

HTH

2

這是一個古老的調用約定...

FAR從時繼承時,處理器寄存器,其中太小,無法容納一個跳轉目標的完整地址。所以,處理器有兩種類型的跳轉,取決於目標來自當前程序計數器的「遠」程度。

PASCAL描述堆棧中的參數順序,它告訴函數使用Pascal編程語言描述的順序,這與C語言不同(非常老版本的操作系統,如使用Pascal開發的MacOS和Windows) 。

6

FAR已過時;它在16位代碼中用來表示可以指向整個地址空間的指針,而不是指向當前段的16位偏移量。

PASCAL是一個調用約定。作爲Wikipedia這樣描述的:

的參數在堆棧上在左到右的順序(CDECL相反)推動,並且被叫方是負責返回之前平衡堆棧。

此調用約定在以下16位API中很常見:OS/2 1.x,Microsoft Windows 3.x和Borland Delphi 1.x.

+0

Mark,我是C++的新手,並被要求將一些舊的C/C++代碼轉換爲C++ 11。數據類型'短FAR *'被大量採用,並且不會在VS2013中解決 - 我應該替換它們嗎?如果是這樣的話? – MoonKnight 2014-07-03 09:08:43

+0

@Killercam你應該能夠在你找到它們的地方放下'FAR'和'NEAR'。雖然我很驚訝他們還沒有被Microsoft標頭定義爲空宏,但它們是向後兼容的王者。 – 2014-07-03 12:15:20

1

具體PASCAL說的論據中從左到右的順序傳遞的功能,這樣可以減少代碼的大小(因爲調用者知道堆有多大,因此可以清理)

C stdcall將參數從右向左傳遞,這意味着您可以擁有可變數量的參數,但需要更多代碼才能清除。