目錄
第1章 可移植性概念 1
1.1 可移植性是一種考慮問題的方式, 而不是一種狀態 1
1.2 培養良好的可移植性編程習慣 2
1.3 良好的習慣勝過故障或標準的具體知識 2
1.3.1 盡早經常移植 3
1.3.2 在不同的環境中開發 3
1.3.3 使用不同的編譯器 4
1.3.4 在多個平颱上進行測試 4
1.3.5 支持多個程序庫 4
1.4 為新項目規劃可移植性 5
1.4.1 使可移植性變得容易 5
1.4.2 選擇可移植性的閤理水平 5
1.4.3 不要將項目變成專有産品 7
1.5 移植舊程序 9
1.5.1 除非程序已經被移植, 否則就認定該程序是不可移植的 9
1.5.2 隻做最低限度必要的改動 9
1.5 3 規劃攻擊目標 9
1.5.4 在修改控製程序中記錄每一件事 10
第2章 ANSI C與C++ 11
2.1 選擇C和C++語言的理由 11
2.1.1 C和C++提供瞭低級訪問 11
2.1.2 C與C++編譯成本機代碼 12
2.2 C與C++的術語 12
2.3 可移植性與C/C++ 13
第3章 可移植性技術 17
3.1 避免使用新特性 17
3.2 處理變化的特性 18
3.3 使用安全的串行化和反串行化 21
3.4 綜閤測試 23
3.5 使用編譯選項 25
3.5.1 編譯時斷言 25
3.5.2 嚴格編譯 26
3.6 從可移植文件中隔離平颱相關文件 26
3.7 編寫簡單明瞭的代碼 27
3.8 使用唯一的名稱 27
3.9 實現抽象 29
3.9.1 分派抽象 30
3.9.2 抽象數據類型 (typedef) 35
3.9.3 使用C預處理程序 37
3.9.4 對無法預料的事情做好準備 38
3.9.5 傳輸與係統相關的信息 39
3.9.6 橋接函數 41
3.10 低級編程 42
3.10.1 避免使用自修改代碼/動態生成代碼 42
3.10.2 保持高級後退 46
3.10.3 關鍵字register 47
3.10.4 外部與嵌入式asm文件 48
第4章 編輯與源代碼控製 51
4.1 文本文件行結束格式之間的差異 51
4.2 可移植的文件名 53
4.3 源控製 53
4.3.1 源控製係統 54
4.3.2 通過代理程序遷齣 56
4.4 構建工具 57
4.4.1 平颱特有的構建工具 57
4.4.2 可移植的構建工具 58
4.5 編輯器 61
4.6 本章小結 62
第5章 處理器的不同之處 63
5.1 對齊 63
5.2 字節排序和Endianess 66
5.2.1 Big-Endian值與Little-Endian值的比較 66
5.2.2 標準化存儲格式 68
5.2.3 固定的網絡字節排序 69
5.3 帶符號整數的錶示方法 70
5.4 本地類型的大小 70
5.5 地址空間 74
5.6 本章小結 75
第6章 浮點 77
6.1 浮點的曆史 77
6.2 標準的C與C++浮點支持 78
6.3 浮點的問題 79
6.3.1 不一緻的評估 79
6.3.2 浮點與聯網應用程序 80
6.3.3 轉換 81
6.4 定點整數數學 82
6.5 從浮點數中析取整數位 82
6.6 實現查詢 85
6.7 異常結果 87
6.7.1 特殊值 88
6.7.2 異常 89
6.7.3 浮點環境訪問 89
6.8 存儲格式 90
6.9 本章小結 91
第7章 預處理程序 93
7.1 預定義符號 93
7.2 頭文件 95
7.2.1 頭文件的路徑規範 96
7.2.2 頭文件名 96
7.3 配置宏 97
7.4 條件編譯 98
7.5 Pragma 99
7.6 本章小結 99
第8章 編譯器 101
8.1 結構大小、填充和對齊 101
8.2 內存管理的特性 104
8.2.1 釋放的影響 104
8.2.2 對齊的內存分配 104
8.3 堆棧 105
8.3.1 堆棧的大小 105
8.3.2 alloca()的問題 106
8.4 printf()例程 106
8.5 類型尺寸與行為 107
8.5.1 64位整數類型 107
8.5.2 基本類型的尺寸 108
8.5.3 有符號與無符號的char類型 110
8.5.4 作用如同int的enum 111
8.5.5 數字常量 112
8.5.6 有符號與無符號的右移 112
8.6 調用約定 113
8.6.1 名稱修飾 114
8.6.2 函數指針與迴調 114
8.6.3 可移植性 115
8.7 返迴結構 116
8.8 Bitfield 116
8.9 注釋 117
8.10 本章小結 118
第9章 用戶交互作用 119
9.1 用戶界麵的演變 119
9.1.1 命令行 119
9.1.2 窗口係統 120
9.2 本機GUI與應用程序GU的比較 121
9.3 低級圖形 121
9.4 數字音頻 122
9.5 輸入 123
9.5.1 鍵盤 123
9.5.2 鼠標 123
9.5.3 操縱杆與遊戲鍵盤 124
9.6 跨平颱工具箱 124
9.7 本章小結 124
第10章 聯網 125
10.1 網絡協議的演化 125
10.2 編程接口 126
10.2.1 套接字 126
10.2.2 RPC (遠程過程調用) 與RMI (遠程方法調用) 128
10.2.3 分布式對象 129
10.3 本章小結 129
第11章 操作係統 131
11.1 操作係統的演化 131
11.2 宿主環境與獨立式環境 132
11.3 操作係統可移植性的悖論 132
11.4 內存 133
11.4.1 內存限製 133
11.4.2 內存映射 133
11.4.3 受保護內存 134
11.5 進程與綫程 135
11.5.1 進程控製與通信函數 135
11.5.2 IPC(進程間通信) 135
11.5.3 多綫程技術 136
11.6 環境變量 140
11.7 異常處理 141
11.7.1 C異常處理 141
11.7.2 C++異常處理 142
11.8 用戶數據存儲 142
11.8.1 Microsoft Windows注冊錶 143
11.8.2 Linux用戶數據 144
11.8.3 OS X的首選項 144
11.9 安全與許可 145
11.9.1 應用程序安裝 145
11.9.2 特權目錄與數據 145
11.9.3 低級訪問 146
11.10 本章小結 146
第12章 動態庫 147
12.1 動態鏈接 147
12.2 動態加載 148
12.3 共享庫的問題 (亦稱為DLL地獄) 148
12.3.1 版本問題 148
12.3.2 擴散 150
12.4 Gun LGPL 150
12.5 Windows DLL 150
12.6 Linux的共享對象 153
12.7 Mac OS X架構、插件捆綁 154
12.7.1 架構 154
12.7.2 捆綁 155
12.7.3 插件 156
12.8 本章小結 157
第13章 文件係統 159
13.1 符號鏈接、快捷方式與彆名 159
13.1.1 Windows的LNK文件 160
13.1.2 Unix的鏈接 160
13.2 路徑規範 160
13.2.1 磁盤驅動器與捲說明符 161
13.2.2 路徑分隔符與其他特殊字符 161
13.2.3 當前目錄 161
13.2.4 路徑長度 162
13.2.5 區分大小寫 162
13.3 安全性與訪問權限 162
13.4 Macintoch的古怪行為 164
13.5 文件屬性 164
13.6 特殊目錄 164
13.7 文本處理 165
13.8 C運行時庫與可移植文件訪問 165
13.9 本章小結 166
第14章 可擴縮性 167
14.1 較好的算法等於較好的可擴縮性 167
14.2 可擴縮性的局限性 168
14.3 本章小結 169
第15章 可移植性與數據 171
15.1 應用程序數據與資源文件 171
15.1.1 二進製文件 171
15.1.2 文本文件 171
15.1.3 XML 173
15.1.4 作為數據文件的腳本語言 174
15.2 創建可移植的圖形 174
15.3 創建可移植的音頻 175
15.4 本章小結 175
第16章 國際化與本地化 177
16.1 字符串與統一代碼標準 177
16.2 貨幣 179
16.3 界麵元素 180
16.4 本章小結 180
第17章 腳本語言 183
17.1 腳本語言的一些缺點 184
17.2 JavaScript/ECMAScript 184
17.3 Python 185
17.4 Lua 186
17.5 Ruby 186
17.6 本章小結 186
第18章 跨平颱的程序庫與工具包 187
18.1 庫 187
18.2 應用程序架構 188
18.2.1 Qt 188
18.2.2 GTK+ 188
18.2.3 FLTK 188
18.2.4 wxWidgets 189
18.3 本章小結 189
附錄A 可移植開源裝置 (POSH) 191
A.1 POSH的預定義符號 191
A.2 POSH的固定大小類型 192
A.3 POSH的實用函數和宏 193
附錄B 用於可移植性的規則 197
· · · · · · (
收起)