ACE網絡庫的主要優勢之一就是跨平台,ACE提供了操作系統API和編譯器級別的跨平台解決方法,使開發人員不用再去關心操作系統和編譯器的差異,但因此也帶來了ACE的復雜性。
ACE網絡庫的組織結構主要分為四層:OS適配層、wrapper facade層、框架層、服務層,其中OS適配層為操作系統API提供了包裝函數,保證了系統級的跨平台特性。
而不同的C++編譯器在以下方面也有明顯的差異:
1、模版;
2、數據類型和寬字符;
3、運行時初始化和關閉;
4、分配堆內存;
以上主要參考自APG裡內容,但APG有些過於陳舊,例如其中提到的ACE_OS為了避免編譯器不支持命名空間,使用類來實現,而在ACE的新版本中已改為命名空間實現。
本文主要討論數據類型和寬字符的ACE跨平台解決方式,基於ACE 6.0版本,ACE的編譯方法可以參考之前寫的http://www.cnblogs.com/ym123/p/4277256.html:
數據類型
不同的C++編譯器的基本數據不同,通常通過預定義類型來解決此,這也是C++常用技巧。
ACE也定義了常用的基本類型:
ACE_INT8、ACE_INT16、ACE_INT32、ACE_INT64和無符號ACE_UINT8、ACE_UINT16、ACE_UINT32、ACE_UINT64;
同時ACE還提供了SIZEOF的定義,可以方便獲得該類型在編譯器的長度:
ACE_SIZEOF_LONG、ACE_SIZEOF_INT、ACE_SIZEOF_CHAR...
ACE還提供了大尾和小尾的定義:
ACE_BYTE_ORDER,其值是ACE_BIG_ENDIAN或是ACE_LITTLE_ENDIAN;
如果數據類型的尺寸對你的程序很重要,就不應該依賴編譯器的硬件尺寸而是使用這些基礎類型,例如常見的確定TCP數據包內容長度的頭尺寸,就應該明確長度。
這些類型定義在ace/Basic_Types.h頭文件中。
窄字符和寬字符
ACE定義了兩個常量:
ACE_HAS_WCHAR 用於啟用ACE的寬字符配置;
ACE_USES_WCHAR 用於指示ACE在內部使用寬字符配置。
這兩個常量在編譯ACE網絡庫時起作用,如果想使用寬字符,編譯ACE時在config.h中輸入:
#define ACE_HAS_WCHAR
#define ACE_USE_WCHAR
ACE定義了ACE_TCHAR類型,根據ACE_USES_WCHAR使用char或者wchar_t;
ACE_TEXT(str),根據ACE_USES_WCHAR正確定義字符串文本;
ACE_TEXT_CHAR_TO_TCHAR(str),如果需要,把char * 轉換為ACE_TCHAR;
ACE_TEXT_WCHAR_TO_TCHAR(str),如果需要,把wchar_t *轉換為ACE_TCHAR;
ACE_TEXT_ALWAYS_CHAR(str),如果需要,把ACE_TCHAR轉換為char *;
ACE定義了ACE_CString和ACE_WString類型,存取窄字符串和寬字符串,具體用法與std::string類型相似,定義在ace/SString.h頭文件中。
ACE解決其他三個編譯器差異的實現在後續博文中講解。
記錄,為更好的自己!