C 的可移植性和跨平台開發 2 語法

2021-08-23 12:56:20 字數 1394 閱讀 8758

目前還有相當一部分開發人員在使用老式編譯器幹活,這些老式編譯器可能對c++98支援不夠。因此,當你的**移植到這些老式的編譯器上時,可能會碰到一些稀奇古怪的問題(包括編譯出錯和執行時錯誤)。下面這些注意事項有助於你繞過這些問題。

強調一下,後面提到的好幾個條款都是通過迴避c++的新語法來保證移植性。如果你用的是新式編譯器,那麼你可以不理會這些條款。

小心for迴圈變數的作用域(不支援新標準)

在c++98標準中,for迴圈變數的作用域侷限在迴圈體內。而某些老的編譯器(例如visual c++ 6)認為for迴圈變數的作用域在迴圈體外。所以如下的**可能導致移植問題。

;template

class tderived : public tbase

};

慎用rtti(不支援新標準、標準未定義)

先宣告一下,我這裡說的rtti主要是指typeid操作符和type_info型別。

首先,由於某些老式編譯器可能不支援typeid操作符和type_info型別,會導致移植性的問題,這是慎用rtti的乙個原因。(如果你用的是新式編譯器,不用考慮這個因素)

其次,由於標準對於type_info型別的約束比較簡單。這導致了不同的編譯器對type_info的實現有較大差異。如果你確實要使用type_info型別,建議僅僅使用它的operator==和operator!=這兩個成員函式。

所以,如果你確實需要在執行時確定型別,又不想碰到上述問題,可以考慮在自己的類體系中加入型別資訊來實現。比如mfc和wxwidgets都是這麼幹的。

慎用巢狀類(不支援新標準)

如果在內部類訪問外部類的非公有成員,要把內部類宣告為外部類的friend。

如下**存在移植問題。

class couter

};};

應該改為如下**

class couter

};};

不要定義引數型別相近的函式(標準未定義)

void foo(short n);

void foo(long n);

foo(0); //會導致二義性錯誤

不要依賴標準型別的字長(標準未定義)

某些標準型別(例如int、wchar_t)的字長會隨著具體的平台而改變。

用列舉代替類的靜態成員常量(不支援新標準)

某些老式的編譯器不支援類的靜態成員常量,可以用列舉來代替。

class cfoo

; //可移植

};

C 的可移植性和跨平台開發 2 語法

目前還有相當一部分開發人員在使用老式編譯器幹活,這些老式編譯器可能對c 98支援不夠。因此,當你的 移植到這些老式的編譯器上時,可能會碰到一些稀奇古怪的問題 包括編譯出錯和執行時錯誤 下面這些注意事項有助於你繞過這些問題。強調一下,後面提到的好幾個條款都是通過迴避c 的新語法來保證移植性。如果你用的...

C 的可移植性和跨平台開發 2 語法

目前還有相當一部分開發人員在使用老式編譯器幹活,這些老式編譯器可能對c 98支援不夠。因此,當你的 移植到這些老式的編譯器上時,可能會碰到一些稀奇古怪的問題 包括編譯出錯和執行時錯誤 下面這些注意事項有助於你繞過這些問題。強調一下,後面提到的好幾個條款都是通過迴避c 的新語法來保證移植性。如果你用的...

C 的可移植性和跨平台開發 0 概述

今天聊聊c 的可移植性問題。如果你平時使用c 進行開發,並且你對c 的可移植性問題不是非常清楚,那麼我建議你看看這個系列。即使你目前沒有跨平台開發的需要,了解可移植性方面的知識對你還是很有幫助的。c 的可移植性這個話題很大,包括了編譯器 作業系統 硬體體系等很多方面,每乙個方面都有很多內容。鑑於本人...