任何推荐的清理"标头意大利面条"的做法都会导致编译时间极慢(Linux/Unix)?
与GCC有"#pragma once"等价吗?
(发现有关此事的相互矛盾的消息)
谢谢.
假设你熟悉"包含警卫"(标题开头的#ifdef ......),另外一种加快构建时间的方法是使用外部包含警卫.它在" 大规模C++软件设计 "中进行了讨论.这个想法是经典包括守卫,不像#pragma一次,不要让你从第二次开始忽略头部所需的预处理器解析(即它仍然需要解析并寻找包含守卫的开始和结束.外部包含警卫你将#ifdef放在#include线本身周围.
所以它看起来像这样:
#ifndef MY_HEADER #include "myheader.h" #endif
当然在H档案中你有经典的包括后卫
#ifndef MY_HEADER #define MY_HEADER // content of header #endif
这样,myheader.h文件甚至不被预处理器打开/解析,它可以在大型项目中节省大量时间,特别是当头文件位于共享远程位置时,就像它们有时一样.
再次,这一切都在那本书中.心连心
如果你想做一个完整的清理并有时间去做,那么最好的解决方案是删除所有文件中的所有#includes(除了显而易见的,例如abc.cpp中的abc.h)然后编译项目.添加必要的前向声明或标题以修复第一个错误,然后重复,直到您干净利落.
这不会解决可能导致包含问题的潜在问题,但它确实确保只包含必需的包含问题.