我创建了一个基于模板的库。我想提供一个我的图书馆的用户可以包含的文件。因为是模板库,所以我觉得库文件需要是.h文件。因此,为了创建,我包含了所有其他模板头文件(带有声明和定义),然后使用 g++ -E 进行编译(只是预处理)。这个想法一直有效,直到使用该库的人使用我也在我的库中使用的标准 header (如字符串)或库(如 boost)。由于预处理,即 String 中的所有定义都被复制到库文件中。如果用户也使用 String,编译器会抛出双重定义错误,因为它在我的库和 header 中定义。
那么我该如何解决我的问题呢?还有另一种生成库文件的方法吗?或者我可以阻止包含 header 并只为除我自己的文件之外的所有其他内容插入包含语句,这些文件在用户编译时处理吗?
谢谢 开发蠕虫
最佳答案
你不应该做预处理;当最终用户使用您的 header 进行编译时,您应该将其留给最终用户的机器。如果你这样做,所有的预处理器工作都会匹配你的系统,这会破坏,例如系统特定的预处理(#if defined (__APPLE__)
)或限制(32 位 int
)。他们也应该拥有标准库的拷贝,他们可能想要与您不同的实现。它还减少了代码膨胀。看看 boost CRC header 的这个片段例如,它提供了一个模板化的 CRC 函数:
#ifndef BOOST_CRC_HPP
#define BOOST_CRC_HPP
#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT, etc.
#include <boost/integer.hpp> // for boost::uint_t
#include <climits> // for CHAR_BIT, etc.
#include <cstddef> // for std::size_t
#include <boost/limits.hpp> // for std::numeric_limits
关于c++ - 创建模板库文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006543/