c++ - 库构建器的预编译头文件用法

标签 c++ visual-c++ precompiled-headers

根据 this answer boost 和 STL header 属于预编译 header 文件(MSVC 世界中的stdafx.h)。所以我更改了我的动态链接库项目的 header ,并将所有 STL/Boost header 移动到我项目的 stdafx.h 中。

之前

#include <boost/smart_ptr.hpp>

namespace XXX
{
  class CLASS_DECL_BK CExampleClass // CLASS_DECL_BK is just a standard dll import/export macro
  {
    private:
      boost::scoped_ptr<Replica> m_replica;
  }
}

之后

namespace XXX
{
  class CLASS_DECL_BK CExampleClass
  {
    private:
      boost::scoped_ptr<Replica> m_replica;
  }
}

现在我有减少编译时间的优势,但是我的库的所有用户都遇到构建错误(例如未知的 boost::scoped_ptr...),因为缺少包含(这是现在移至我的 stdafx.h)。


什么可以解决这个难题?

我希望减少编译时间包含我的头文件后的编译错误对于 dll 的任何用户来说都是 Not Acceptable 。

这有帮助吗?

  • 保留所有包含指令,但在我的“stdafx.h”中复制它们?由于 stdafx.h 始终首先包含在我项目的任何 cpp 文件中,所以我应该没问题,用户不会收到任何错误。或者,如果在一个翻译单元中多次包含相同的 header (有 header 保护),我是否会失去速度优势?

感谢任何提示!

最佳答案

当您将 header 包含在库 header 中,并将它们另外放入 stdafx.h 时,您应该几乎获得相同的速度提升。

或者,您可以添加一个额外的定义(批量 external include guard )

// stdafx.h
#define MY_LIB_STD_HEADERS_ALREADY_INCLUDED

// library_file.h
#ifndef MY_LIB_STD_HEADERS_ALREADY_INCLUDED
#include <boost/smart_ptr.hpp>
...
#endif

但只有当您确定有帮助时,我才会这样做。只需拿一个秒表并运行一些重新编译。 (不需要链接。)然后你会看到有什么不同。

一边

我不确定在项目某处中添加所有所需的boost header 是否是个好主意。我会说 shared_ptr 和 friend ,boost/foreach,也许 Boost.Format,... 是个好主意,但我已经对 Boost 进行了三思。正则表达式 header 。 注:我did not do any speed measurements ,但我依稀记得 pch 文件的大小问题和一些编译器问题。我真的should do some tests .

还要检查有问题的 Boost 库是否提供转发 header ,以及您是否应该包含它们。膨胀预编译的头文件可能有它的缺点。

关于c++ - 库构建器的预编译头文件用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7280571/

相关文章:

c++ - 处理 char 到 QString 转换中的 ASCII 字符

C++ 读取数学函数和排序

c++ - 函数: 'find' 未为 std::vector 定义

c++ - 预编译 header 给出杂散的 216 错误

C++ 预编译 header 已禁用

c++ - Visual Studio 2015 中的预编译 header 错误

c++ - 在 C++ 中的链表末尾插入一个节点 (walter/savitch)

c++ - 对成员函数的模糊调用以在 lambda 中捕获 this

c - 在 WinAPI 中重置信号量计数器

c - 在 C 源代码中省略内联 ASM 代码