c++ - 创建模板库文件

标签 c++ templates

我创建了一个基于模板的库。我想提供一个我的图书馆的用户可以包含的文件。因为是模板库,所以我觉得库文件需要是.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/

相关文章:

c++ - 如何编译修改后的 videoInput.h

C++ 从 .txt 中读取浮点值并将它们放入一个未知大小的二维数组中

c++ - 在模板虚类层次结构中调用基类方法

c++ - 通过可变参数模板传递右值引用时出现编译器错误

c++ - LNK2019 未解析的外部符号

c++ - 这是什么人物?

c++ - Boost asio async_write_some 泄漏?

c++ - 为什么我需要为传递给 Y 组合器的函数指定返回值

Java 泛型和 C++ 模板,如果生成的代码大小很重要,哪个是首选?

c++ - std::bind()、可变参数模板和完美转发如何结合?