我经常发现文件的标题部分一直变得越来越大但它永远不会变小.在源文件的整个生命周期中,类可能已经移动并被重构,很可能有很多#includes
不需要在那里再存在.将它们留在那里只会延长编译时间并增加不必要的编译依赖性.试图弄清楚哪些仍然需要可能是相当繁琐的.
是否有某种工具可以检测多余的#include指令并建议哪些可以安全删除?
lint可能这样做吗?
我知道PC-Lint可以告诉你包含但未使用的标题.有没有其他工具可以做到这一点,最好是在Linux上?
我们拥有一个庞大的代码库,在过去的15年中已经看到了大量的功能,但是当功能从一个实现文件移动到另一个实现文件时,很少会删除剩余的#include指令,这一点让我们陷入了相当糟糕的状态.显然我可以去除所有#include指令并让编译器告诉我哪些重新包含,但是我宁愿反过来解决问题 - 找到未使用的指令 - 而不是重建已使用的指令列表.
如何在C或C++项目中维护#include语句?似乎几乎不可避免的是,最终文件中的include语句集合不足(但由于项目的当前状态而恰好起作用)或包含不再需要的东西.
您是否创建了任何工具来发现或纠正问题?有什么建议?
我一直在考虑编写一些单独编译每个非头文件的东西,每次都删除一个#include语句.继续这样做,直到达到最小的包含集.
为了验证头文件是否包含他们需要的所有内容,我将创建一个源文件,它所做的只是包含头文件并尝试编译它.如果编译失败,那么头文件本身缺少一个include.
在我创作之前,我想我应该问一下.这似乎是一个普遍的问题.
通常在编写新代码时,您会发现缺少#include,因为该文件无法编译.很简单,你添加了所需的#include.但是后来你以某种方式重构代码,现在不再需要一些#include指令.如何发现不再需要哪些?
当然,我可以手动删除部分或全部#include行并将其添加回来,直到文件再次编译,但这在包含数千个文件的大型项目中实际上并不可行.有没有可用的工具可以帮助自动化任务?
假设我有fileA.h
一个声明classA
具有模板功能的类SomeFunc<T>()
.此函数直接在头文件中实现(通常用于模板函数).现在我添加一个专门的实现SomeFunc()
(比如for SomeFunc<int>()
)fileA.C
(即不在头文件中).
如果我现在SomeFunc<int>()
从其他代码调用(也许还来自另一个库),它会调用泛型版本还是专门化版本?
我现在遇到这个问题,类和函数存在于两个应用程序使用的库中.一个应用程序正确使用专门化,而另一个应用程序使用通用形式(稍后会导致运行时问题).为什么不同?这可能与链接器选项等有关吗?这是在Linux上,使用g ++ 4.1.2.
我想减少大型C++项目的编译时间.我尝试使用预编译的头文件,接口等.但在我继续之前,我想知道是否有任何工具可以帮助检测为什么编译时间如此之长.有人建议使用pc-lint,我会试一试. 如何在大型C++项目中检测不必要的#include文件? 但是,如果有其他工具可以分析编译时间并讨论任何提高编译速度的提示,请告诉我.提前致谢.
环境:Microsoft Visual Studio C++ 2008或2010.
如何找到代码的哪些部分需要很长时间才能编译?
我已经在为所有标题使用预编译头文件,它们肯定会提高编译速度.然而,每当我对我的C++源文件进行更改时,编译它需要很长时间(这是CPU /内存绑定,而不是 I/O绑定 - 它都是缓存的).此外,这是不相关的连接部分,只是编译部分.
我试过打开/showIncludes
,但当然,因为我使用的是预编译的头文件,所以后面没有任何内容stdafx.h
.所以我知道只有源代码需要一段时间才能编译,但我不知道它的哪一部分.
我也试过做一个最小的构建,但它没有帮助.也没有/MP
,因为它无论如何都是单个源文件.
我可以尝试通过添加/删除源代码来解析源代码并确定哪个部分是瓶颈,但这是一个痛苦而且无法扩展.此外,很难删除某些东西,仍然让代码编译 - 错误消息,如果有的话,几乎立即回来.
有没有更好的方法来弄清楚什么会减慢编译速度?
或者,如果没有办法:是否有任何语言结构(例如模板?)需要花费更长的时间来编译?
我在C++源代码中有什么:
三个(相对较大的)ATL对话框类(包括定义/逻辑).
它们很可能是原因,但无论如何它们都是程序的核心部分,所以显然每当我更改它们时都需要重新编译它们.
随机单行(或类似小)实用程序函数,例如字节数组到十六进制转换器
对我的头文件中找到的(内联)类的引用.(其中一个头文件是巨大的,但它只使用最少的模板,当然它是预编译的.另一个是TR1 regex
- 它很大,但它几乎没用过.)
我正在寻找技术,我可以更一般地应用这些问题的原因,而不是针对我的特殊情况的具体建议.希望这对其他人也更有用.
我有一个非常大的项目,其中包含大量复杂的头文件,这些文件都包含在内.它还依赖大量的第三方库.我正在努力理清这个烂摊子,但是我遇到了一些麻烦,因为很多时候我会删除一个#include指令,但却发现它所包含的内容仍然包含在其他文件中.有什么工具可以帮助我理解这个吗?我真的希望能够点击.h文件并询问它(直接或间接)包含哪些CPP文件,以及包含它的路径,同样点击一个cpp文件并询问它.包括h文件(直接和间接).我从来没有听说过这样做的工具,而且一些快速的谷歌搜索没有改变任何东西,但也许我不知道该搜索什么.
c++ ×9
c ×4
include ×3
header ×2
header-files ×2
coding-style ×1
compilation ×1
dependencies ×1
file ×1
g++ ×1
linker ×1
linux ×1
refactoring ×1
templates ×1
visual-c++ ×1