智慧裝置專案的編譯器
更新:2007 年 11 月
Visual Studio 包含下列以智慧型裝置所使用之微處理器為目標的編譯器:
32 位元 C/C++ 編譯器可用於編譯及連結 32 位元 ARM C 與 C++ 程式
32 位元 C/C++ 編譯器可用於編譯及連結 32 位元 Renesas SH-4 C 與 C++ 程式
C/C++ 編譯器可用於編譯及連結 MIPS16、MIPS32、MIPS64 C 與 C++ 程式
編譯器會產生通用物件檔案格式 (Common Object File Format,COFF) 的目的檔 (Object File)。編譯器程式每次編譯時都會編譯每一個原始程式檔,除非另行指定,否則也會編譯目的檔。編譯器包含了列在命令列 (CL)、CL 環境變數中,以及任何指定之回應檔中的選項。
Visual Studio 編譯器在桌面和裝置之間的差異
差異 |
描述 |
---|---|
[進階] 索引標籤、[針對架構編譯] 下拉式清單。 |
在 [專案屬性]、[進階] 索引標籤、[針對架構編譯] 清單中的裝置專案中,[C/C++] 節點下的下拉式方塊中有下列選項:[Arm4 (/QRarch4)]、[ARM5 (/QRarch5) ]、[Arm4t (/QRarch4t) ]、[ARM5t (/QRarch5t)]。 |
[進階] 索引標籤、[ARM 和 ARM 捲動方塊交互作用] 下拉式清單。 |
在 [專案屬性]、[進階] 索引標籤、[ARM 和 ARM 捲動方塊交互作用] 清單中的裝置專案中,[C/C++] 節點下的下拉式方塊內具有下列選項:[是 (/QRInterwork-return)] 和 [否] 選項。當設定為 [是] 時,編譯器會產生 Thunk 程式碼,在 ARM 16 和 32 位元程式碼之間交互作用。 |
[進階] 索引標籤、[啟用浮點模擬] 下拉式清單。 |
在 [專案屬性]、[進階] 索引標籤、[啟用浮點模擬] 下拉式清單中的裝置專案中,[C/C++] 節點下的下拉式方塊內具有下列選項:[是] 和 [否] 選項。當設定為 [是] 時,編譯器會啟用浮點作業的列舉。 |
[前置處理器] 索引標籤、[前置處理器定義 ] 輸入方塊 |
在 [專案屬性]、[前置處理器] 索引標籤、[前置處理器定義] 輸入方塊內的裝置專案中,於 [C/C++] 節點之下有一個 [從父代或專案預設值繼承] 核取方塊和 [巨集] 按鈕可用來加入巨集。 |
[最佳化] 索引標籤、[浮點一致性定義] 下拉式清單。 |
在 [專案屬性]、[最佳化] 索引標籤、[浮點一致性定義] 下拉式清單中的裝置專案中,[C/C++] 節點下有一個下拉式清單可選取 [預設一致性] 或 [增強一致性 (/Op)]。 |
如需詳細資訊,請參閱依字母順序排列的編譯器選項。
與 Visual Studio 舊版不同的變更
Visual Studio 2003 和 Visual Studio 2005 編譯器之間的變更
因為裝置編譯器是以桌上型電腦 Visual C++ 編譯器為基礎,所以檢視桌上型電腦編譯器不同版本之間的差異,大略就可以得知 eMbedded Visual C++ 裝置編譯器和 Visual Studio 2005 裝置編譯器之間的變更。如需 Visual Studio 6.0 和 Visual Studio 2003 之間變更的資訊,請參閱 Compatibility and Compliance Issues in Visual C++。
下表摘要出 Visual Studio 2003 和 Visual Studio 2005 編譯器之間的變更:
變更 |
說明 |
---|---|
成員指標現在要求函式呼叫中要有限定名稱 (Qualified Name)、傳址運算子 (&) 和括號 |
針對只使用方法名稱之舊版編譯器所寫的程式碼,現在則會產生「編譯器錯誤 C3867」或「編譯器警告 C4867」。依據 ISO C++ 標準,這是必要的診斷。若要建立成員指標函式,您必須使用傳址運算子 (&) 以及方法的完整名稱。沒有使用 & 運算子以及方法的完整名稱,或者是函式呼叫中沒有使用括號,都可能會產生錯誤。若使用沒有引數清單的函式名稱,則會使函式指標可轉換成數種型別,因此,程式碼可能會在執行階段產生無法預期的行為。 |
friend 宣告必須能夠存取類別 |
舊版的 Visual C++ 編譯器針對在包含宣告的類別範圍中無法存取的類別啟用了 friend 宣告。在 Visual C++ 2005 中,這種情況會造成編譯器產生「編譯器錯誤 C2248」。若要解決這個錯誤,請變更 friend 宣告中所指定之類別的存取範圍。這項變更是為了符合 ISO C++ 標準。 |
明確特製化不能做為複製建構函式和複製指派運算子 |
依賴明確樣板特製化做為複製建構函式或複製指派運算子的程式碼,現在則會產生「編譯器錯誤 C2299」。ISO C++ 標準並不允許這種用法。我們是為了符合標準而做了這項變更,以便增進程式碼的可移植性。 |
非特製化類別樣板不能用來做為基底類別清單中的樣板引數 (Template Argument) |
針對類別定義在基底類別清單中使用非特製化樣板類別名稱,則會造成「編譯器錯誤 C3203」。您不能使用非特製化樣板類別名稱做為基底類別清單中的樣板參數,使用樣板類別名稱做為基底類別清單中的樣板參數時,您必須明確地將樣板型別參數加入至樣板類別名稱。我們是為了符合標準而做了這項變更,以便增進程式碼的可移植性。 |
不再允許使用巢狀型別宣告 |
使用巢狀型別宣告的程式碼現在則會產生「編譯器錯誤 C2885」。若要解決這個錯誤,您必須使用巢狀型別的完整限定參考,將型別放在命名空間 (Namespace) 中,或是建立 typedef。我們是為了符合標準而做了這項變更,以便增進程式碼的可移植性。 |
/YX 編譯器選項已經移除 |
/YX 編譯器選項會產生自動先行編譯標頭支援,根據預設,它是用於開發環境中。如果您從組建組態中移除 /YX 編譯器選項,就能更快地產生組件。除了效能問題之外,/YX 編譯器選項還可能會造成無法預期的執行階段行為。建議您最好是使用 /Yc ([建立先行編譯標頭檔]) 以及 /Yu([使用先行編譯標頭檔]),這樣比較能夠控制使用先行編譯標頭的方法。 |
/Oa 和 /Ow 編譯器選項已經移除 |
/Oa 和 /Ow 編譯器選項已經移除並且會遭到忽略。請使用 noalias 或 restrictdeclspec 修飾詞,指定編譯器處理別名的方式。 |
/Op 編譯器選項已經移除 |
/Op 編譯器選項已經移除。您可以使用 /fp:precise 做為替代選項。 |
/ML 和 /MLd 編譯器選項已經移除 |
Visual C++ 2005 不再提供單一執行緒、靜態連結的 CRT 程式庫支援;您可以改為使用 /MT 和 /MTd。 |
/G3、/G4、/G5、/G6、/G7 和 /GB 編譯器選項已經移除 |
編譯器現在是使用「混合模型」,它會針對所有架構試圖建立最佳輸出檔案。 |
/Gf 編譯器選項已經移除 |
您可以改為使用 /GF。/GF 會將已緩衝字串放入至唯讀區段,這比 /Gf 用來放置已緩衝字串的可寫入區段還要安全。 |
/GS 編譯器選項在新版預設為開啟狀態 |
緩衝區溢位檢查在新版預設為開啟狀態,您可以使用 /GS- 關閉緩衝區滿溢檢查功能。 |
/Zc:wchar_t 變數在新版預設為開啟狀態 |
這是 ISO C++ 標準行為:wchar_t 變數會預設為內建的型別,而不是不帶正負號的短整數。如果以未含 /Zc:wchar_t 而編譯的程式庫連結用戶端程式碼,這項變更會破壞二進位碼相容性。您可以使用 /Zc:wchar_t- 還原成舊版非標準化的行為。預設會使用這項變更,以建立符合標準的程式碼。 |
/Zc:forScope 變數在新版預設為開啟狀態 |
這是 ISO C++ 標準行為:在 for 迴圈範圍結束後,若程式碼相依於 for 迴圈中所宣告之變數的使用,則現在將無法編譯此程式碼。您可以使用 /Zc:forScope 還原成舊版非標準化的行為。預設會使用這項變更,以建立符合標準的程式碼。 |
強制執行 Visual C++ 屬性的參數檢查 |
當型別不是字串時,若程式碼使用引號將具名屬性傳遞至屬性建構函式 (當型別是字串時,則不使用引號),現在則會產生「編譯器錯誤 C2065」或「編譯器警告 (層級 1) C4581」。在以前,所有的編譯器屬性都會剖析成字串,如果有需要,編譯器也會插入遺漏的引號。藉由加入參數檢查驗證而增強了屬性支援,這項變更可防止由於將不正確的引數傳遞至屬性建構函式,而產生之無法預期的行為。 |
編譯器不會在宣告中插入 int 型別做為預設型別 |
現在不會再將宣告中遺漏型別的程式碼預設為 int 型別。編譯器會產生「編譯器警告 C4430」或「編譯器警告 (層級 4) C4431」。ISO C++ 標準不支援預設的 int,這項變更可確保取得您明確指定的型別。 |
如需詳細資訊,請參閱 Visual C++ 2005 編譯器的重大變更。