c++ - 我在哪里可以学习有关C++编译器的 “what I need to know”?

标签 c++ c compiler-construction

我刚刚开始探索C++,因此请原谅这个问题。我也请您放心这个问题有多开放。我认为可以将其分解,但是我认为这些信息属于同一地方。

(仅供引用-我现在主要使用QT SDK和mingw32-make,并且似乎已经为我的机器正确配置了它们。)

我知道该语言中有很多是由编译器驱动的-我听说过预编译器指令,但是似乎有人可以编写有关不同C++编译器及其各自参数的书。另外,有些命令显然在make之前(例如,像qmake(仅在QT中是这样))。

我想知道是否有任何地方可以让我大致了解那里的编译器以及它们的不同选项。我还想知道它们每个人如何查看Makefile(它们之间的语法似乎有所不同吗?)。

如果没有关于“您需要了解C++编译器的所有知识,但又害怕问”的网站,那么学习这些问题的答案的最佳方法是什么?

最佳答案

关于“各种编译器的众多选项”
一个好消息:您不必担心其中大多数选项的细节。在适当的时候,您将仅针对所使用的编译器,并且可能仅针对与一组特定功能有关的选项来进行深入研究。但是,作为新手,通常会信任默认选项或make文件随附的选项。

这些功能的大致类别(我可能会遗漏一些):

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

  • 关于编译器及其选项和功能的 list
    我不知道这样的列表,但我确定它可能存在于网络上。但是,建议作为新手,您不必担心这些“细节”,并使用可以找到的任何免费编译器(gcc当然是个不错的选择),并具有使用该语言和构建过程的经验。 C专业人士可能会出于充分的理由而在各种编译器和相关的runtine等的优缺点上争论不休,但出于通用目的(然后是某些目的),只需要免费的东西。

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

    在预处理器上:
    预处理程序是迈向编译的第一步,尽管从技术上讲,它不是编译的一部分。此步骤的目的是:
  • 删除任何注释,以及多余的空格
  • 用相关的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,有点像留在他/她房间里阅读Webster词典的交换生,这是为与母语人士见面而准备的“准备”,而不仅仅是“做到这一点!”。

    关于c++ - 我在哪里可以学习有关C++编译器的 “what I need to know”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1774537/

    相关文章:

    c - 隐藏 Execve 的终端输出

    C-程序抛出段错误

    c++ - openMP lastprivate 和 firstprivate 到同一个变量

    c++ - 在 Electron 中调用 Node Native Addons (C++)

    c - 实现一个像设备一样的菜单,每个命令都没有条件

    c - OpenMP 和私有(private)可重用内存

    使用 GCC -O2 选项编译生成不同的程序

    c++ - 将python编译成共享库

    c++ - 从 C++ 成员函数调用 Objective-C 方法?

    c++ - Arduino SIM800L : converting String to char* error