ACE服務端程式設計2 ACE跨平台之資料型別和寬字元

2022-05-03 06:15:06 字數 1518 閱讀 2049

ace網路庫的主要優勢之一就是跨平台,ace提供了作業系統api和編譯器級別的跨平台解決方法,使開發人員不用再去關心作業系統和編譯器的差異,但因此也帶來了ace的複雜性。

而不同的c++編譯器在以下方面也有明顯的差異:

1、模版;

2、資料型別和寬字元;

3、執行時初始化和關閉;

4、分配堆記憶體;

以上主要參考自apg裡內容,但apg有些過於陳舊,例如其中提到的ace_os為了避免編譯器不支援命名空間,使用類來實現,而在ace的新版本中已改為命名空間實現。

本文主要討論資料型別和寬字元的ace跨平台解決方式,基於ace 6.0版本,ace的編譯方法可以參考之前寫的

資料型別

不同的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解決其他三個編譯器差異的實現在後續博文中講解。

記錄,為更好的自己!

ACE服務端程式設計3 ACE跨平台之分配堆記憶體

ace服務端程式設計系列的第三篇,ace解決不同編譯器之間分配堆記憶體的差異。在ace的官方示例中會看到大量的ace new return,ace new這樣的巨集,這是ace為了消除不同編譯器編譯的 在堆上分配記憶體失敗的行為差異。具體來說 使用 malloc calloc 等分配記憶體的函式時,...

ACE服務端程式設計5 ACE日誌輸出和跟蹤

伺服器程式經常需要在命令列中顯示錯誤訊息 狀態或者用來跟蹤程式的執行路徑,最簡單的方法是使用printf。ace提供了更強大日誌設施 1 可以在編譯時啟用或禁用巨集 2 可以動態的啟用或禁用巨集 3 支援日誌嚴重級別 4 支援日誌重定向 5 支援多執行緒安全和執行緒級配置 使用ace的日誌相關功能,...

基於ACE的網路服務端通訊程式設計

完成了基本的通訊功能 測試報告如下 昨天準備11臺 只有7臺機子可以執行 每個開了10個 大部分 都好的 有1台開10個的時候出錯 還有1臺早上看的時候10個都出錯 根據上面的圖顯示結果來看是由於服務端先關閉,客戶端傳送資料失敗導致。源 如下 class clientacceptor public ...