Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅仅添加一些文档就会触发重新编译:有解决方案吗?_C++_Documentation_Makefile_Header - Fatal编程技术网

C++ 仅仅添加一些文档就会触发重新编译:有解决方案吗?

C++ 仅仅添加一些文档就会触发重新编译:有解决方案吗?,c++,documentation,makefile,header,C++,Documentation,Makefile,Header,有时,当我查看头文件时,我想在(doxygen)文档中添加一些内容。这可能是一个关于函数参数使用的快速说明,或者只是修正了一点输入错误 但是我想:哦,不,这会在下一个make调用中触发重新编译!对于某些基本标题,整个项目将重新编译,这可能需要很长时间。所以,别客气 这一困境有解决办法吗?是否存在函数/类不直接记录在标题中的方法?或者是否有(计划)一个smartmake会注意到只有一些注释已更改,但无需重新编译?为什么不将文件恢复到make认为它不会更改的时间 正如一个接一个的建议,您可以将其包装

有时,当我查看头文件时,我想在(doxygen)文档中添加一些内容。这可能是一个关于函数参数使用的快速说明,或者只是修正了一点输入错误

但是我想:哦,不,这会在下一个
make
调用中触发重新编译!对于某些基本标题,整个项目将重新编译,这可能需要很长时间。所以,别客气

这一困境有解决办法吗?是否存在函数/类不直接记录在标题中的方法?或者是否有(计划)一个smart
make
会注意到只有一些注释已更改,但无需重新编译?

为什么不将文件恢复到make认为它不会更改的时间


正如一个接一个的建议,您可以将其包装成一个简单的脚本。

您可以使用缩短编译时间,可能使用
CCACHE\u UNIFY
环境选项集

ccache散列预处理器输出,如果未检测到任何更改,则为先前编译的对象提供服务

关于CCACHE_UNIFY的手册页部分

CCACHE\u UNIFY

如果设置环境变量
CCACHE\u UNIFY
,则CCACHE 将在散列预处理器输出时使用C/C++统一器 如果编译中没有使用-g。统一者比一个人慢 普通散列,因此设置此环境变量会损失一点 有点速度,但这意味着ccache可以利用not 当对源代码的更改包括 仅重新格式化。请注意,使用
CCACHE\u UNIFY
会更改 哈希,因此不能使用缓存的编译集
CCACHE\u UNIFY
set 当未设置
CCACHE\u UNIFY
时,反之亦然。统一的原因 默认情况下为off是因为它可能给出错误的行号 编译器警告消息中的信息


只需进行更改,并接受重新编译。当开发人员害怕顺从时,实际上不可能有一个功能性的开发环境;也许您需要研究一个分布式网格编译系统,它将减少编译时间?

严格按照文件上的时间戳进行编译,并且明确没有计划扩展它。make除了用于C之外,还用于很多其他用途,它对文件的内容一无所知。如果make不得不分析这些更改,那么您的构建可能会慢很多

您可以将文档保存在头文件之外,而只保存在.c文件中,这将限制需要重新编译的内容的范围。我承认,我个人更喜欢在头文件中记录“接口”函数,但从doxygen的角度来看,这并不重要

正如另一位用户所建议的,您可以通过使用“触摸”来追溯文件的日期,从而绕过此系统

doxygen允许您在外部文件中添加注释,但这通常是一个不受欢迎的解决方案;doxygen的全部要点之一是使文档与源代码保持接近


否则,我建议你修正你的编译速度。。。你真的不应该害怕他们

我的解决方案是不在Makefile中包含作为依赖项的头文件。。。因此,对头文件的更改不会触发“make”的任何重新编译

当然,这样做的缺点是,如果我做了影响内存布局的更改(例如,向类中添加成员变量),我需要记住手动触摸受影响的.cpp文件(或者如果很难确定哪些cpp文件受到影响,请执行“make clean;make”),这可能有点容易出错。。。但是它通常对我有用。

签出(你做版本控制,不是吗?)代码库的另一个副本在不同的目录中,只是为了这些编辑


它可以是一个单独的分支,也可以不是。然后,当这些小的变化发生在你身上时,你就在这里做它们。你可以直接承诺:现在他们在一个安全的地方,不会打扰你的实际发展。每隔一段时间,比如一周一次,如果您的构建时间真的那么长,您可以将这些更改合并到您正在处理的内容中。合并冲突应该很少发生,只要您在一个目录中编写文档,在另一个目录中编写代码。

我会使用“touch-r file.h timestamp”来实现这一点。。。编辑文件.h。。。重新生成文档(但不是代码)。。。“touch-r timestamp file.h”使用“touch”方法是可以的,但可能容易出现错误:如果您实际上也在该头中进行了代码更改,但您已经忘记了该更改,该怎么办?这就是为什么要保存和恢复文档更改前后的时间戳。这样,如果您以前修改过该文件,那么之前的修改仍然可见。只有当您同时意外更改文档和代码时,您才会遇到您所暗示的问题。这是忽略更改的代价,所以不要这样做。实际上,Qt所做的正是所有文档都包含在实现文件中,而不是标题中。我几乎也谈到了这一点,大部分工作都发生在实现文件中,而不是头文件中。我通常坚持在头文件中记录接口的规则,具体实现的注释在实现文件中。@Harold-如果大部分代码都是内联的或模板的,这会不会变得很尴尬?@Duck-这是一个很好的观点。C++将其抛出,因为它确实鼓励您将一些实现置于头文件中。我想你被卡住了。@Duck-想看看一些模板类,但我这里没有源代码,在那里找不到任何内联文档。这些文档可能在一个单独的文件中……除了容易出错之外,对于任何规模合适的项目,如果您不知道有多少个实现,这也不可能扩展