代码之家  ›  专栏  ›  技术社区  ›  cwallenpoole

我在哪里学习关于C++编译器的“我需要知道什么”?

  •  3
  • cwallenpoole  · 技术社区  · 15 年前

    我刚开始探索C++,所以请原谅这个问题的新鲜感。我也请你纵容这个问题有多开放。我认为它可以被分解,但我认为这个信息属于同一个地方。

    (仅供参考——我现在主要使用qt sdk和mingw32 make,我似乎已经为我的机器正确配置了它们。)

    我知道语言中有很多是编译器驱动的——我听说过预编译指令,但是好像有人能够编写不同C++编译器的书以及它们各自的参数。此外,在make之前还有一些命令(例如qmake,这只是qt中的命令吗)。

    我想知道是否有什么地方可以让我大致了解编译器的存在以及它们的不同选项。我还想知道他们每个人如何查看makefiles(似乎他们之间的语法有差异?).

    如果没有关于“你需要知道的关于C++编译器的一切,但不敢问”的网站,“什么是最好的方法去学习这些问题的答案?”

    3 回复  |  直到 15 年前
        1
  •  17
  •   mjv    15 年前

    关于“各种编译器的众多选项” 一个好消息是:你不必担心这些选项的细节。您将在适当的时候深入研究这个问题,只针对您使用的编译器,可能只针对与特定功能集相关的选项。但是作为新手,通常要相信默认选项或随make文件提供的选项。

    这些功能的广泛类别(我可能会遗漏一些)包括:

    • 预处理器定义(现在,您可能需要其中一些)
    • 代码生成(目标CPU、FPU使用率…)
    • 优化(提示编译器优先考虑速度而不是大小等)
    • 包含调试信息(这是对象/二进制文件中剩余的额外数据,使调试器能够知道每行代码的起始位置、变量名等)。
    • 链接器指令
    • 输出类型(exe、库、内存映射…)
    • C/C++语言符合性和警告(与编译器的以前版本兼容,符合当前和过去的C标准,警告常见的可能的bug指示模式……)
    • 编译时详细信息和帮助

    关于编译器及其选项和功能的清单
    我不知道这样的列表,但我确信它可能存在于网络上。然而,建议作为一个新手,你很少担心这些“细节”,使用任何你能找到的免费编译器(GCC当然是一个很好的选择),并建立语言和构建过程的经验。C专业人员可能会有充分的理由,并最终对各种编译器和相关的runtine等的优点进行争辩,但出于一般目的(然后是某些目的),需要的只是免费的东西。

    关于构建过程
    最简单的应用程序,例如由单个编译单元(读取单个C/C++源文件)组成的应用程序,可以用简单的批处理文件来构建,其中各种编译器和链接器选项都是硬编码的,并且在命令行上指定文件名。
    对于所有其他情况,它 对编译构建过程非常重要 这样就可以做到
    a)自动和
    b)可靠,即具有可重复性。
    与这个构建过程相关联的“配方”通常封装在 make文件 或者随着复杂性的增加,可能会有几个生成文件,可能“捆绑在一个脚本/BAT文件中”。
    您需要熟悉这个(生成文件语法),即使您使用make/nmake的替代方法,例如ApacheAnt;原因是很多(大多数?)源代码包包括make文件。
    简而言之 ,使文件为文本文件,并允许定义 目标 以及 命令 建立一个目标。每个目标都与其 依赖关系 ,这使得make逻辑可以决定哪些目标已过期,应该重新构建,并且在重新构建之前,还应该重新构建哪些可能的依赖项。这样,当您修改一个include文件(如果make文件配置正确)时,使用此头文件的任何C文件都将被重新编译,并且与相应的obj文件链接的任何二进制文件也将被重新编译。make还包括强制重新构建所有目标的选项,这有时很方便确保您真正构建了当前的目标(例如,在make中没有声明给定对象的某些依赖项)。

    在预处理器上 : 预处理器是编译的第一步,尽管从技术上讲,它不是编译的一部分。此步骤的目的是:

    • 删除任何注释和无关空白
    • 用相关的C/C++语法替换任何宏引用。例如,有些宏用于定义常量值,例如程序中使用的某些电子邮件地址;在每次处理过程中,对该常量值的任何引用(btw,根据惯例,这些常量的命名方式为 ALL_CAPS_AND_UNDERSCORES )替换为包含电子邮件地址的实际C字符串文字。
    • 排除所有不相关的条件编译分支(ifdef等)

    关于预处理器的重要信息是,预处理器指令不是C语言的一部分,它们提供了一些重要的功能,例如前面提到的条件编译(例如,程序有多个版本,例如用于不同的操作系统,或者用于不同的编译器)s)

    从那里拿走… 在我的宣言之后…我鼓励阅读更多内容,并深入研究编程和构建二进制文件。 It is a very good idea to try and get a broad picture of the framework etc. but this can be overdone 这有点类似于交换生呆在他/她的房间里读韦伯斯特词典是为了“准备”会见母语人士,而不仅仅是“做它!”.

        2
  •  3
  •   Martin Beckett    15 年前

    理想情况下,你不需要关心你正在使用的C++编译器。近年来,标准的兼容性得到了很大改善(甚至来自微软)。

    编译器标志明显不同,但通常都有相同的特性,这只是一个不同的命名选项,例如在gcc和ms cl上设置警告级别。

    编译系统独立于编译器,您可以将任何make与任何编译器一起使用。

        3
  •  3
  •   wallyk    15 年前

    一个问题很多。

    C++ 编译器很像锤子:它们有各种尺寸和形状,有不同的能力和特性,适用于不同类型的用户,价格也不同;最终它们都是为了完成与其他人相同的基本任务。

    有些应用程序专门用于高性能图形等高度专业化的应用程序,并且有许多扩展和库来帮助工程师解决这些类型的问题。其他的是一般用途的,不一定总是最适合极端工作的。

    使用每种类型锤子的技术因型号而异,也因型号不同而有所不同,但它们都有很多共同之处。宏预处理器是C和C++编译器的标准部分。

    许多的简单比较 C++ 编译器是 here . 还可以查看 C 编译器,因为许多程序不使用任何C++特性,可以通过普通编译。 C .


    C++ 编译器不“查看”生成文件。MaFaX文件的规则可以调用C++编译器,但也可以“编译”汇编语言模块。 装配 )处理其他语言、构建库、链接模块和/或后处理对象模块。makefile通常包含清除中间文件、建立调试环境、获取源代码等规则。编译是开发软件的一系列步骤中的一个环节。

    此外,许多开发环境将makefile抽象为“项目文件”,由 integrated development environment (ide)试图简化或自动化许多编程任务。查看比较 here .

    至于学习:选择一个具体的问题来解决并深入研究。目标平台(Linux/Windows/etc)和问题空间将很好地缩小选择范围。您所选择的通常与其他考虑因素相关联,例如为特定公司工作或作为团队的一部分。C++在其所有的味道中都有95%种共性。好好学习他们中的任何一个,学习下一个是小菜一碟。