2009-11-21 50 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%的通用性。了解其中的任何一个,学习下一个是一块蛋糕。

相关问题