2010-09-07 114 views
2

有沒有辦法讓msvc編譯器像gcc一樣嚴格? MSVC讓我做一些非常瘋狂的事情,當我在linux中編譯時會導致數百個錯誤。使MSVC編譯器GCC complient?

感謝

+0

@Milo - 我會密切關注這個問題。我目前正在將一個巨大的代碼從MSVC移植到GNU工具鏈上,我感覺你很痛苦。 – 2010-09-08 00:01:39

+0

你能提供一些例子嗎?我的印象是,MSVC總是禁止許多完全有效的C語言(至少C99),因爲它們不在C++中,它本質上是一個假裝C是C++子集的C++編譯器... – 2010-09-08 00:09:11

+0

@R:既然他是從MSVC到Linux我不會被C99/C++ 03特定的代碼困擾太多,並且GCC不支持這些代碼(假設使用了最新版本的GCC)。 – dirkgently 2010-09-08 00:11:46

回答

2

要開始我們就需要你在(爲MSVC)的版本,你打什麼樣的錯誤(編譯時,鏈接時或運行時)等。

假設你是一個相對較新的版本(MSVC 2008 SP1)和編譯器錯誤被竊聽,我建議如下:

  • 你的程序的入口點main而不是_tmainWinMain
  • /W4:警告視爲錯誤
  • 刪除所有以_開頭的功能 - 它們是具體的實施
  • 沒有的Win32 API要麼
  • 沒有特定於平臺的線程
  • 檢查,如果你有char
  • 相同的符號性如何做這兩種實現治療wchar_t
  • 沒有安全的異常處理或內聯彙編魔法
  • 沒有COM/MFC要麼
+0

我的問題不是msvc中的錯誤,問題是msvc讓太多的東西滑動,而gcc更嚴格 – jmasterx 2010-09-08 00:19:40

+0

@Milo:上面的列表是可能導致悲傷的指示。沒有任何來自你身邊的例子,你的問題就很難回答。 – dirkgently 2010-09-08 00:23:56

5

一個更好的問題是:MSVC,g ++或任何其他編譯器標準兼容,如果是,則是相同的標準版本?你不應該依賴於一套常見的非標準行爲。就我個人而言,我負責在g ++ 4.1.x和VC7.1上編譯超過500KLOC的C++。這兩種編譯器都可以有很多的支持。

這兩種編譯器都有語言或庫擴展。 g ++傾向於將庫擴展放在單獨的名稱空間中。 VC,至少老版本,不太好。兩者都具有默認打開的語言擴展,或者可以通過編譯器開關啓用(或禁用)語言擴展。你最好禁用所有的語言擴展。

您可以設置的每個編譯器的警告級別越高越好 - 並且不要忽視來自任一編譯器的警告,而無需理由。

對於Windows,默認情況下,我使用以下選項:/W3 /wd4355 /wd4805 /wd4710。我想使用/W4,但第三方庫使這個級別難以承受。 對於g ++,我使用-Wall -Wextra。我也想使用-Wold-style-cast,但是我依賴太多違反這個的第三方庫。

每個編譯器都會針對不同的結構發出警告,或者對它們提出不同的警告。您最好注意兩個編譯器的輸出,並找到它們之間的代碼子集,它們可以產生零個警告,儘可能高的警告級別。

+0

+1。您可以設置幾個選項,這些選項將有所幫助,但是在一天結束時,無法用兩個編譯器定期構建項目。我一直在使用g ++和Visual Studio每天構建相同的代碼5年以上,除了std :: tr1怪癖和使用'typename'之類的東西之外,還有很少的東西可以在其中工作,另一個。便攜式書寫,你不應該有問題。 – 2010-09-09 08:22:28