如果您有一个包含多个源文件的c ++项目并且您点击了编译,编译器会从哪个文件开始?
我问的是因为我在库中遇到了一些#include-dependency问题。
编译器将是:VC2003。
答案 0 :(得分:15)
它不应该依赖于顺序。唯一相关的步骤是:
答案 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文件中指定的依赖关系的有向非循环图。这通常会说可执行文件取决于许多目标文件。目标文件取决于源文件,每个源文件都依赖于头文件,依此类推。
这实际上产生了一个多路树。树将以可执行文件作为其根,并且通常主要具有作为叶节点的标头(尽管如果您使用某种代码生成器,它也可以将该代码生成器的输入文件作为叶子)。
然后,它从树叶节点到根节点行走,然后构建它。说“无关紧要”的答案基本上指出它可以选择该树的任何分支来构建。然而,重要的是,当它选择一个分支时,它会按照为该分支指定的顺序构建。