如果僅考慮 Windows 平台,不用 msvc 而去用 gcc 的理由有哪些?

僅限windows平台!

僅限windows平台!

僅限windows平台!

程序僅支持win平台的話,不用msvc而用gcc去編譯,有哪些理由?


1、大部分跨平台的大型C程序(如ffmpeg)早已完全使用C99標準編寫,而msvc的編譯器CL直到2015年才較好地支持了C99;

2、msvc的側重點是對C++標準的支持以及對Windows SDK的支持,而不是對C語言的支持。

3、msvc的編譯器很難用於生成和環境無關的代碼(並不是不能,不過可能涉及到運用老版本和彙編器),用來編譯像Bootloader、系統內核之類的特殊程序時會有麻煩。

4、msvc的編譯器CL的命令行參數和gcc、clang等幾乎完全不兼容,所有的makefile和其他腳本都必須專門為其做較大改動。

5、msvc工具鏈(編譯器、鏈接器、nmake等)的ABI和gnu工具鏈的只有單向兼容,無法鏈接由gnu工具鏈生成的庫。


主要的理由在於gcc對語言標準的支持快一些好一些,無論是C還是C++都如此。

C的話,MSVC一直非常消極,2015以前的版本都只支持到C89。很長時間裡連for頭上定義變數都不行。

C++的話,MSVC對Modern C++的支持速度也是主流編譯器里最慢的。雖然g++ 4.8的&空定義事件令人好感度大跌,但還是比VC到2015才支持raw string literal/unicode string literal強。

其他方面在windows平台上gcc不如cl。編譯速度也好,目標碼的性能也好,gcc都沒什麼優勢。

還有一點,C和C++標準里都遺留了大量未定義行為,這些法外之地里gcc和cl的表現常常完全不同,甚至互相衝突。這也是要考慮的。


當有程序依賴了GCC的C擴展功能的時候。例如用C寫個解釋器想比switch-threaded快的話用computed goto:

大背景參考這裡:https://www.complang.tuwien.ac.at/forth/threaded-code.html

例子參考這裡:Computed goto for efficient dispatch tables

The simple VM implemented with a computed goto

&<- 試試用MSVC編譯這段下面的例子,肯定是編譯不了的,因為label as value(computed goto)是GCC擴展,Clang也支持,但MSVC不支持。


用到pthread相關的東西的時候?


當你不得不使用一些 .a 的時候~


去年的事情。

我下了個開源項目,作者在README里寫明是支持VC2013的,可是用VC2015編譯不過。

你說我難道再花幾個小時去裝VS2013不成?何況我硬碟也沒那麼大剩餘空間。

於是我還是改回用mingw編譯了。


C++11的很多特性,VS直到2015版才補全。儘管通常都不是什麼重要特性,但如果你用到了,就特么是個麻煩事。

另外,VS2015的C++標準庫居然依賴MFC,不裝MFC就蹦出海一樣多的編譯時錯誤,這是要哪樣啊!


我要移植別人的原本用於gcc的代碼


都作了一個Linux進去了 能不能把 cl nmake 那些的弄成 Linux 可用啊?


我要寫C++程序啊,我不會寫C艹程序啊,不用GCC或者Clang你讓我怎麼辦?VC又不支持C++……


有可能是用到了僅支持GCC的開源庫,也可能是程序員習慣


指定所需的語言標準在 gcc 里一個選項的事情(-std),用 MSVC 里幾乎沒法做(麻煩得要死)。


GCC順手,更新容易。 vs正常卸載都做不到


高版本 VC 要兼容 XP 必須用兼容 XP 工具集 + 靜鏈 MSVCRT,然後如果你有文件大小潔癖的話,這樣生成的文件果斷要比動鏈 MSVCRT 的 MinGW 大不少 ˊ_&>ˋ


我能說因為我喜歡用code::blocks么

自帶GCC.


大家說的原因比較多了,我經歷過的另一個原因是移植。因為使用 linux 開發程序的時候使用的是 gcc 所以移植到 windows 很自然的就用上了 mingw 和 msys


在VS2015之前,沒有社區版,沒錢買。

所以用GCC。

現在有vs2015社區版,但是我機器太舊了,卡死了,已經安裝Linux作為開發使用。

所以還是用GCC。


在window上交叉編譯用gcc或者cgwin用gcc算了?


沒有。這樣做很傻。在Windows平台應該永遠用最新版的VC++編譯器/鏈接器,充分使用最新的編譯器和鏈接器的優化選項

你可以根據目標平台使用兼容性最大的Windows SDK,好好指定WINVER。你想跨Windows/*NIX平台的話把源代碼好好寫,不要去找編譯器不兼容的借口


微軟的編譯器要錢啊,GCC不要錢啊。


有時候就想寫個十幾行的小程序,驗證下自己對c++某個特性的理解。不想為它專門開visual studio,又不熟悉visual studio的c++編譯器在命令行下雜用。就gvim + mingw了。


推薦閱讀:

事件驅動機制跟消息驅動機制相比,有哪些優劣的地方?
軟體著作權,這幾大公司的軟體著作權可以記這個人名下?求解答?見截圖?
如何分析和提高大型項目(C/C++)的編譯速度?
C++中,如何在標準庫的std::string和常用庫(Qt,VC等)的QString之間進行選擇?
微軟vector類中resize函數的實現對比linux是不是不夠好?

TAG:C編程語言 | C | GCC | VisualC | MinGW-w64 |