2009-11-21 49 views
3

我剛開始探索C++,所以請原諒這個問題的新穎性。我也懇求你放縱這個問題是如何公開結束的。我認爲它可以被分解,但我認爲這些信息屬於同一個地方。我在哪裏可以學習關於C++編譯器的「我需要知道的內容」?

(僅供參考 - 我主要是用QT SDK和mingw32的,作出正確的現在的工作,我似乎已經爲我的機器正確配置它們。)

我知道有很多的語言,是編譯器驅動的 - 我聽說過預編譯器指令,但似乎有人能夠爲不同的C++編譯器和它們各自的參數編寫書籍。另外,有一些命令顯然在make之前(比如qmake,例如(這是QT中的這個東西))。

我想知道是否有任何地方給我一個編譯器的概述,以及它們的不同選項。我也想知道他們每個人如何看待Makefiles(看起來他們之間的語法有所不同)?

如果沒有關於「你需要知道的關於C++編譯器但不敢問的一切」的網站,那麼學習這些問題的答案的最好方法是什麼?

回答

17

關於「各種編譯器的衆多選項」 一條好消息:您不必擔心大多數選項的細節。您將在適當的時候深入研究這一點,僅針對您使用的編譯器,也許僅適用於與特定功能集相關的選項。但作爲新手,一般信任默認選項或與make文件一起提供的選項。

該大類的這些特徵(我可以缺少幾個)爲:

  • 處理器預先定義(現在,可能需要幾的這些)
  • 代碼生成(目標CPU ,FPU使用...)
  • 優化(提示編譯器有利於在速度和大小等)
  • 包容的調試信息(這是留在物體額外的數據/二進制和使調試器知道在哪裏每行代碼開始,變量名稱是什麼等)
  • 指示鏈接器
  • 輸出類型(EXE,圖書館,內存映射...)
  • C/C++語言遵從性和警告(與以前版本的編譯器,合規兼容當前和過去的C類標準,警告常見的可能的錯誤指示模式...)
  • 編譯時間冗長,並幫助

關於他們的編譯器選項的清單,並設有
我知道沒有這樣的名單,但我敢肯定它可能存在於網絡上。然而,建議作爲一個新手,你不必擔心這些「細節」,並使用你可以找到的任何免費編譯器(gcc當然是一個很好的選擇),並建立語言和構建過程的經驗。 C專業人士可能會有充分的理由和充分的理由爭論各種編譯器和相關runtine等的優點,但爲了通用目的 - 然後是一些 - 免費的東西就是所需要的。

關於構建過程
最瑣碎的應用,例如這些由彙編的單個單元(讀取單個的C/C++源文件),可以用簡單的批處理文件來構建的,其中各種編譯器和鏈接器選項是硬編碼的,並且在命令行中指定文件的名稱。
對於所有其他情況下,它編纂構建過程,以便它可以做到
 一個)自動並
  b)中可靠地,即具有可重複性是很重要的。
「配方」這一構建過程相關的往往是在封裝make文件或作爲複雜性的增加,可能的幾個make文件,在腳本/ bat文件可能是「捆綁在一起。
這(讓文件語法)您需要熟悉,即使您使用替代方法來製作/ nmake,例如Apache Ant;原因是許多(大多數?)源代碼包都包含make文件。文本文件和他們允許定義目標,以及相關的命令建立一個目標,每個目標都與其dependenci相關ES,允許化妝邏輯來決定什麼指標已經過時,應該重建,以及重建他們面前,有什麼可能的依賴也應該被重建。這樣,當你修改說一個包含文件(如果make文件被正確配置),其使用該頭將被重新編譯任何C文件,並與相應的obj文件鏈接將被重建以及任何二進制。令還包括選項強制所有目標進行重建,而這有時是方便的,以確保你真正擁有一個內置的電流(例如在的情況下給定對象的一些依賴不會在化妝聲明)。

在預處理器上: 預處理器是編譯的第一步,雖然它在技術上並不是編譯的一部分。該步驟的目的是:

  • 以除去任何評論,多餘的空白
  • 替代與有關C/C++語法任何宏參考。例如,一些宏用於定義常量值,例如在程序中使用某個電子郵件地址;期間每個處理這一恆定值的任何參考(順便說一句按照慣例,例如常量命名爲ALL_CAPS_AND_UNDERSCORES)是常量,其中包含電子郵件地址的實際C字符串替換。
  • 排除所有條件編譯分支不相關(在#IFDEF等)

瞭解預處理器最重要的是,該預處理器指令不是C-的一部分適當的語言,並且它們服務於幾個重要的功能,例如前面提到的條件編譯(例如用於具有多個版本的程序,針對不同的操作系統,或者針對不同的編譯器)。

從中取出。 .. 我的這個宣言後...我鼓勵閱讀但李多花點錢,並潛入編程和構建二進制文件。 It is a very good idea to try and get a broad picture of the framework etc. but this can be overdone,有點類似於留在自己房間的交換學生閱讀韋伯斯特詞典,以「準備好」會見母語人士,而不僅僅是「做!」。

3

理想情況下,你不應該關心你使用的是什麼C++編譯器。近年來,與標準的兼容性得到了很大提高(甚至來自微軟)

編譯器標誌明顯不同,但相同的功能通常是可用的,它只是一個不同的命名選項,例如。在GCC和ms-cl上設置警告級別編譯系統是編譯器獨立的,你可以在任何編譯器中使用make。

3

很多問題都在其中。

C++編譯器很像錘子:它們具有各種尺寸和形狀,具有不同的功能和特性,適用於不同類型的用戶以及不同的價格點;最終他們都是爲了和其他人一樣完成同樣的基本任務。

一些適用於高度專業化的應用程序,如高性能圖形,並有許多擴展和庫來幫助工程師處理這些類型的問題。其他人是爲了一般用途而使用,並不一定總是對極端工作最大的。

使用每種類型錘子的方法因型號不同而不同,版本也不盡相同,但它們都有很多共同之處。宏預處理器是C和C++編譯器的標準部分。

許多C++編譯器的簡要比較是here。還請查看C編譯器列表,因爲許多程序不使用任何C++功能,並且可以通過普通的C進行編譯。


C++編譯器不會「查看」makefile。 makefile的規則可以調用C++編譯器,但也可以「彙編」彙編語言模塊( 彙編),處理其他語言,構建庫,鏈接模塊和/或後處理對象模塊。 Makefile通常包含清理中間文件,建立調試環境,獲取源代碼等的規則。編譯是開發軟件的一個長鏈步驟中的一個環節。

此外,許多開發環境將makefile抽象爲一個「項目文件」,integrated development environment(IDE)使用它來試圖簡化或自動化許多編程任務。看比較here

至於學習:選擇一個特定的問題來解決和潛入。目標平臺(Linux/Windows/etc)和問題空間將縮小選擇的範圍。您選擇的內容通常與其他考慮因素相關聯,如爲特定公司工作或成爲團隊的一部分。 C++在所有風格中具有95%的通用性。瞭解其中的任何一個,學習下一個是一塊蛋糕。

相關問題