若要寫跨平台的程式,首先要使用各平台都有提供的程式庫,編寫各平台都可執行的程式碼,其次就得依平台的不同編寫適用的程式碼。 這個機制採用引入檔 SYSSELEC.HPP 作為控管,可依平台的不同選擇適合的程式碼編譯,只要引入 SYSSELEC.HPP,再依如下的方式使用即可:
#if (SysSelect == _WIN32_CxxlMan)
// 程式碼
#endif
SYSSELEC.HPP 會依不同平台把代表編號指定給 SysSelect 符號常數,目前提供的代表編號有以下: #define _WIN32_CxxlMan 1 // WIN32 平台
#define _LINUX_CxxlMan 2 // linux 平台
#define _MAC_CxxlMan 3 // MAC 平台
SYSSELEC.HPP 如何判斷所處平台呢?主要依靠編譯器提供的平台符號識別字:
__WIN32__ |
Win32 平台的須提供此符號識別字 |
__linux__ |
linux 平台的須提供此符號識別字 |
一般來說編譯器都會自動提供符合所處平台的符號識別字,若編譯器沒有提供正確的平台符號識別字,SYSSELEC.HPP 會阻止繼續編譯並顯示錯誤訊息,這時須自行加上,如:
gcc -D__linux__ foo.cpp -o foo
另外提供以下三個適合各平台的呼叫慣例:
cxxlCDECL |
函數的參數自右向左推入堆疊,函數結束後由呼叫端負責清除參數佔用的堆疊,對於參數個數不定的函數須用此呼叫慣例 |
cxxlSTDCALL |
函數的參數自右向左推入堆疊,由被呼叫的函數負責清除參數佔用的堆疊 |
cxxlFASTCALL |
前兩個參數由 CPU 的暫存器傳入,剩下的參數自右向左推入堆疊,由被叫的函數負責清除參數佔用的堆疊 |
|