2013-04-01 82 views
-2

我已經安裝了cygwin並使用它在Windows上編程C++。編譯C++代碼以在Windows和Linux中表現相同

我更喜歡在Windows中編寫我的代碼(這些是分配),但代碼也需要能夠在Linux上運行。雖然代碼在大多數情況下很好地運行,但似乎在Windows上有一些工作,但會在Linux上導致段錯誤(例如引用未初始化的變量和指針)。我不明白爲什麼代碼在前者中工作失敗(或爲什麼他們不這樣做)爲什麼代碼在前者中失效(或者爲什麼他們不這樣做)只是表現得一樣)。如何讓我的代碼在兩者中表現完全相同?這甚至有可能嗎?

雖然我是C++ noob,但我沒有使用任何特定於Windows的庫,所以我可能會誤解簡單/重要的內容。最後,我知道使用未初始化的變量和指針是不好的 - 我想在Windows中使用它們的原因分段錯誤。

+7

未定義的行爲最有可能 - 你在兩個方面都做錯了,但它只在一個上崩潰。如果你寫了正確的代碼,它應該工作。發佈崩潰的確切代碼。 –

回答

1

你所描述的「引用未初始化的變量和指針」被稱爲未定義的行爲。這意味着「你的運氣可能會有所不同」 - 它可能在一個系統上以某種方式做某件事,而在另一個系統上做某件事。不幸的是,作爲「C和C++應該是高效語言」的一部分,未定義行爲的行爲就是這樣 - 編譯器不需要關心它,並且C或C++標準中沒有定義什麼應該會發生。

如果您將-Wall應用於您的編譯器,它應該會爲幾乎所有類型的未初始化變量提供警告。

使它成爲你的規則,只要你聲明一個變量,你也可以爲它賦值。這樣做絕對不是一個壞主意。即使只是給它分配一些無用的值,也不如試圖確定爲什麼你的計算在四層嵌套循環內部的某個地方出現錯誤。

您也可以嘗試使用Microsoft Visual Studio工具 - 這些工具中有一個免費的「Express Edition」。如果使用調試模式編譯,它將生成額外的代碼(嘗試)檢測未初始化變量的使用。

我不知道一個「庫」,它允許你在未初始化的變量上發生故障。

+0

感謝您對未定義行爲的解釋。另外,增加'-Wall'給了我一個很好的(很長的)我沒有初始化並且來自Java的東西的清單,這將幫助你。 – Mafro34

+0

只需添加:使用'-ansi'和'-pedantic'幫助實現可移植性。 – Mafro34

1

諸如引用初始化變量和指針

完全正確。根據我的經驗,我看到在Windows上編譯的C++代碼(Visual C++MinGW GCC)指針未初始化爲NULL。

所以像這樣的東西不會segfault。 (你沒有得到你想要什麼,但ATLEAST你不知道。殘忍。)

int *p; 
*p = 1; 
std::cout<<*p; 

但是至少在Linux系統(GCC)似乎它們初始化爲NULL。所以上面的代碼將會出現段錯誤。

最好的解決方案是打開您正在使用的編譯器的未初始化變量警告(gcc Wuninitialized),然後告訴它將所有警告視爲錯誤(gcc Werror)。

您可以至少在嘗試移植代碼之前這樣做。

爲了更好的分析,您可以使用像valgrind這樣的工具。

相關問題