2014-09-29 121 views
2

我剛剛決定學習C.我注意到我可以下載多個編譯器。如果我爲一個編譯器編寫C代碼,它應該適用於所有編譯器,對嗎?使用多個編譯器編譯C代碼

+0

用盡可能多的不同編譯器編譯代碼是合理可行的(N> 1比N == 1好得多)。關於代碼的問題你會得到不同的看法。確保您也將編譯器的警告級別設置爲較高級別,然後注意他們的說法。例如,如果其中一個編譯器是GCC,則可以使用'-Wall -Wextra -Werror'來發現大多數問題。您還需要指定一個標準,例如'-std = c11',並且可能會添加'-pedantic'以避免意外使用編譯器擴展。我使用比GCC更多的選項。 – 2014-09-29 04:20:35

+0

保持多個編譯器與許多爲每個庫建立的庫(你自己和第三方)保持最新狀態可能是一件非常痛苦的事情。值得一看像'cmake'這樣的工具,它可以通過多個編譯器來構建。這不是什麼魔術般的解決方案,但它可以提供幫助。幾年前,我曾經在MinGW GCC和VC++之間來回切換。即使只使用GCC,我仍然使用cmake。 – Steve314 2014-09-29 05:34:01

回答

6

簡短的回答:是的

龍答:

是的,但前提是(但不限於):

  • 你的代碼不使用編譯器的具體的東西,這不是可以用另一個編譯器
  • 您的代碼依賴的庫可用並在另一個編譯器上正確設置
  • 您的代碼不會調用/依賴在未定義或實現定義的行爲上
  • 其他編譯器大致使用當前編譯器的C標準進行編譯。

我會在列表中添加更多,因爲我認爲他們。

+0

通過未定義的行爲,你的意思是一個編譯器可以比另一個編譯器更好地處理未定義的行爲?一個編譯器中的意義錯誤,但不是另一個,是正確的? – DivideByZero 2014-09-29 03:54:59

+3

@ user3155415未定義的行爲正是它所說的:undefined。這意味着兩個不同的編譯器可以完成兩個完全不同的事情。兩者都不比其他更好。未定義的行爲總是邏輯上的錯誤。 – 2014-09-29 03:55:52

+0

實現定義的行爲不一定是個大問題。例如,'LONG_MAX'的值是實現定義的,所以如果你的代碼根據'LONG_MAX'的值改變了它的行爲,它就會顯示實現定義的行爲。但這可能不是問題。未定義的行爲是有問題的行爲,並且['惡魔'](http://www.catb.org/jargon/html/N/nasal-demons.html) - 如'未定義的行爲可能會帶來惡魔飛出你的鼻子「 - 應該令人難忘(如果不合情理)。 – 2014-09-29 05:28:03

2

在C標準中,定義了兩種類型的'compiler-dependent'問題:

  • 實現定義的行爲:行爲可能會從編譯器有所不同的編譯器,但是編譯器必須提供某種形式的一致行爲並且必須記錄這種行爲。

    一個直接來自標準的例子:「一個實現定義的行爲的例子是當一個有符號整數右移時高位傳播。」換句話說,編譯器之間的-1 >> 1的結果可能會有所不同,但編譯器必須保持一致。

  • 未定義的行爲:當您遇到未定義的行爲時,任何事情 - 我的意思是任何事情都可能發生。

您還需要注意違反約束條件。標準通常指定諸如「[main]應該用int [...]的返回類型」(§5.1.2.2.1/ 1)來定義。這相當於「如果使用int以外的返回類型聲明main,則程序的行爲是未定義的。」 (請參閱§4.2,其中標準明確支持該解釋)

請注意,某些實現定義的行爲有限制 - 例如sizeof(int)的值是實現定義的,但您知道sizeof(int)> = sizeof(short)& & sizeof(int)< = sizeof(long) - 所以只是有任何實現定義的行爲並不意味着你不能說什麼程序的作用。