我有一个包含两个函数的c ++程序文件。如果我单独更改第一个函数,为什么它们都必须重新编译? 是否有任何构建系统单独重新编译第一个并将其放回同一个目标文件中? 这可能吗?一个功能的说明不应该依赖于其他权利? 由于gmake重新编译整个文件,需要花费很多时间,这是不可避免的?将第二个函数放在一个单独的文件中并不是一个好主意,因为它涉及创建不需要的不需要的文件。
答案 0 :(得分:6)
如果第二个函数很长或需要更多时间进行编译,请将其放在单独的文件中。这就是人们分离源文件的原因。据我所知,它必须编译整个文件,因为源中的一个小变化将导致输出文件发生重大变化,因为函数不会相互链接。
答案 1 :(得分:5)
我怀疑使用任何编程语言只能编译源文件的一部分。编译基于每个文件进行。
答案 2 :(得分:4)
在大多数情况下,用于确定给定源文件的哪些语义部分已更改并因此需要重新编译的分析可能会超过编译本身的成本。
通过分析源文件之间的依赖关系,构建系统获得了巨大的成功,因为文件I / O(特别是包含文件)的成本占整个编译成本的很大一部分。一旦您决定重新编译给定的源文件,您可能只会忽略文件中未更改的部分,从而实现极小的加速,即使计算这些部分的成本为零也是如此。
答案 3 :(得分:1)
我知道C ++的所有构建系统都在翻译单元(文件)级别上工作,而不是在功能级别上。虽然理论上考虑预处理器时它应该是可能的,例如
#define ANSWER 42
void foo()
{
#undef ANSWER
#define ANSWER 41
}
int bar()
{
return ANSWER;
}
虽然这是一个糟糕的代码,但任何符合标准的编译器/构建系统都应该支持它。正如您所看到的,更改foo
(重新定义ANSWER
)会影响bar
。
答案 4 :(得分:1)
将第二个函数放在单独的文件 是个好主意,如果你想避免这个“问题”,是是必要的。如果你的函数太大以至于重新编译一个文件所花费的时间是显而易见的,那么该文件可能太大而且应该分解。
答案 5 :(得分:0)
问题不是gmake,而是编译器。如果更改了一个功能,则可能别无选择,只能重新编译其他功能。例如:
a
调用函数b
,并且您更改函数b
,则需要确保a
仍然正确调用b
,以防万一b
的签名已更改。b
位于内存中的a
和c
之间,现在b
增长,使其不再适合,则可能需要移动a
1}}或c
,它还涉及重新编译以生成正确的偏移量。b
不再位于同一位置,则需要编译其来电者a
以指向正确的功能。可能有更多更好的案例需要这样做。