C ++编译器从哪里开始?

时间:2009-12-14 13:02:27

标签: c++ compiler-construction

如果您有一个包含多个源文件的c ++项目并且您点击了编译,编译器会从哪个文件开始?

我问的是因为我在库中遇到了一些#include-dependency问题。

编译器将是:VC2003。

9 个答案:

答案 0 :(得分:15)

它不应该依赖于顺序。唯一相关的步骤是:

  1. 每个编译单元都包含它所依赖的内容,并且应该单独编译。这意味着,首先,每个CPP文件包括它依赖的所有头文件;第二,每个标题应该包含它所需要的内容,以便它可以编译,即使它是第一个要编译的。
  2. 链接步骤将所有编译的目标代码放在一起并构建最终的二进制文件。

答案 1 :(得分:5)

它开始的文件无关紧要,链接器在编译完所有文件后解析外部引用

答案 2 :(得分:4)

无关。发布确切的问题。编译顺序是非确定性和任意的,并且必须对项目的可编译性没有影响。

答案 3 :(得分:3)

这取决于环境。通常,“编译器”一次只能在单个源文件上运行;您使用更高级别的工具来指导它并计算正确的构建顺序。

此类工具的示例可以是make,ant,CMake,SCons,Eclipse和Visual Studio。基本检查通常是源代码文件的修改日期,以及定义各种输出文件如何依赖于输入的内置和自定义规则。

答案 4 :(得分:1)

编译器编译的顺序应该没有区别,正如其他人所指出的那样。

从编译器的角度来看,当您使用#include编译文件时,包含的文件将插入到#include所在的正在编译的文件中,并根据需要进行递归。 / p>

答案 5 :(得分:1)

我能想到的唯一“包含 - 依赖”问题是递归包含。修正通常用#ifdef

来保护它
#ifndef INCLUDED_THEFILENAME_H
#define INCLUDED_THEFILENAME_H

/* content goes here *

#endif

但你最好详细说明你所遇到的问题。

答案 6 :(得分:1)

其他人已经说过,订单不应该有所作为。

您可能没有意识到编译器会编译每个.cpp.cc文件。它确实编译头文件。通常,您只有#include个头文件和从不 .cpp个文件,因此顺序无关紧要。每个.cpp文件都是独立处理的。它包含许多标题,但这些标题永远不会单独编译,而通常还包含其他.cpp文件。

答案 7 :(得分:0)

正如其他人所指出的那样,从概念上讲,开始使用哪个文件并不重要。但是,从最近编辑的文件(假设已编辑多个文件)开始,使用具有最多依赖项的文件会很有用。某些环境(例如Code :: Blocks)实际上允许您对源文件赋予权重,以便对编译顺序进行一些控制。

答案 8 :(得分:0)

make工具构建make文件中指定的依赖关系的有向非循环图。这通常会说可执行文件取决于许多目标文件。目标文件取决于源文件,每个源文件都依赖于头文件,依此类推。

这实际上产生了一个多路树。树将以可执行文件作为其根,并且通常主要具有作为叶节点的标头(尽管如果您使用某种代码生成器,它也可以将该代码生成器的输入文件作为叶子)。

然后,它从树叶节点到根节点行走,然后构建它。说“无关紧要”的答案基本上指出它可以选择该树的任何分支来构建。然而,重要的是,当它选择一个分支时,它会按照为该分支指定的顺序构建。