是否可以以忽略注释(或空白)中的任何更改的方式设置构建链?例如,每当头文件中的注释发生更改时,包含它的每个源文件都会重新编译,即使这是完全不必要的。
当预处理器从修改的文件中删除注释后,构建链可以首先检查输出是否确实发生了变化。如果没有,它应该表现得好像文件本身没有改变一样。
顺便说一句,我正在使用 Visual Studio 2010。
编辑:@MikeSeymour,VS 的 cl.exe 有一个用于最小重建的开关 /Gm。它没有很好的记录,但我认为它有点符合我的要求。 但是 它与使用多核的 /MP 开关不兼容。在我的双核(带超线程)上,/Gm 平均需要跳过 4 个单元中约 3 个单元的编译。虽然我对这种情况感到怀疑,但我什至不知道如何评估 /Gm 是否值得。
是的。 您必须拥有一个构建系统,该系统可以让您在某些谓词为真时触发构建事件。 你想要的是一个谓词,“这个文件已经以语义上有趣的方式改变了”。
这种谓词的一个很好的近似存在,以我们的 SmartDifferencers 系列工具的形式存在,这些工具使用源代码结构的深入知识(例如,生产解析器)来比较源代码文件。 特别是,SmartDifferencer 将根据语言结构(例如标识符、语句、声明、块)和合理的编辑操作(插入、替换、删除、移动、重命名、跨块重命名等)的更改来显示源代码的更改.)。 它对布局或注释不感兴趣(除非你强迫它这样做)。 因此,让 SmartDifferencer 判断源代码文件是否更改了注释或空格以外的内容非常容易。 SmartDifferencers 适用于多种语言。
现在,如何让构建系统进行协作? Unix Make 在谓词上触发,但不是这种;它实际上所做的是根据文件日期与目标相比的新近度触发实体上的构建事件。 如果 SmartDifferencer 发现有趣的差异,您可以通过依赖“changed_signal”文件来伪造此文件,通过制造这样的文件。
没有。
编译器如何知道您对文件所做的唯一更改是在注释中,直到它编译该文件?
后续文件必须重新编译,因为依赖文件确实发生了更改,即使生成的二进制文件是相同的。
有很多技术可以避免大量的相互依赖。尝试使用前向声明。
使用前向声明,您只需要编译实际使用该代码的代码。斯科特·迈尔斯的书可以告诉你更多。关于这个主题有好几页。