C++: 跨平臺注意事項
阿新 • • 發佈:2019-01-10
1. 下面的寫法不是跨平臺的:
std::vector<std::list<int>>
原因是最後的>>在某些平臺下會編譯失敗。
2. 標頭檔案不是self-suffcient
例如這樣的一個頭檔案:
#pragma once
inline bool isValidPtr(int* ptr)
{
return ptr == NULL;
}
其中NULL在此標頭檔案中沒有任何定義。如此則會在某些平臺下會編譯失敗。
3. 過長的相對包含路徑。
如果每個檔案中都使用相對路徑來包含其他檔案,則在某些平臺下會因為路徑只是純疊加而不歸一化而導致路徑長度超過260個字元。使得編譯失敗。
4. Placement new
在某些平臺下(例如一些Android手機),placement new對地址有對齊要求。如果地址不是對齊的,則會報告SIGBUS錯誤。
SIGBUS(Bus error)意味著指標所對應的地址是有效地址,但匯流排不能正常使用該指標。通常是未對齊的資料訪問所致。
5. SIGSEGV
在POSIX相容的平臺上,SIGSEGV是當一個程序執行了一個無效的記憶體引用,或發生段錯誤時傳送給它的訊號。SIGSEGV的符號常量在標頭檔案signal.h中定義。因為在不同平臺上,訊號數字可能變化,因此符號訊號名被使用。通常,它是訊號#11
6. 隱式型別轉換
iOS平臺下對型別轉換有著更加嚴格的檢查。例如下面的程式碼會出錯:
int* foo()
{
int ret = 0;
return ret; // 型別轉換失敗!
}
7. 重定義alignof
以alignof為關鍵字重新定義符號在一些平臺下可能會導致衝突。
8. <malloc.h>
iOS 下沒有這個檔案。如果你需要用malloc和free,請#include <stdlib.h>
9. min和max
建議使用如下程式碼:
#include <algorithm>
std::min
std::max