gpt4 book ai didi

c++ - 头文件如何安全地包含标准库供消费者导入它们

转载 作者:行者123 更新时间:2023-11-28 04:26:11 25 4
gpt4 key购买 nike

假设我想创建以下类:

#pragma once
#include <memory>
#include <string>

namespace stackquestion
{
struct Logger
{
void Log(std::string message);
private:
class Impl;
std::unique_ptr<Impl> impl;
};
}

当我想发布类时,我最终取决于我的消费者对 std::stringstd::unique_ptr 的定义。我对发布的含义含糊不清。我正在考虑将用于静态或动态链接的库交给某人。

当我退回到没有这些内容的版本时,我最终失去了我想要获得的舒适感/安全感。

#pragma once

namespace stackquestion
{
struct Logger
{
void Log(const char *);
private:
class Impl * impl;
};
}

我是否缺少 Elixir ?

最佳答案

两种解决方案都可以,具体取决于您的目标。

包括内存和字符串

这样做不会破坏代码,您确实会强制他们使用 C++11 或更高版本来使用您的库。然而,我认为这是一个加分点,因为您不必为了支持 C++98 而乱搞很多技巧。

在编译代码时,他们不应该与标准库混淆,所以如果他们做类似 #defined unique_ptr shared_ptr 的事情我会因为糟糕的编码而责怪你的用户,而不是你。是的,你可以尝试防止用户做很多坏事,如重载 operator& (地址),但是,您最终会得到类似 STL 实现的代码,这也不是很好。

使用pimpl

使用疙瘩可以解决上述许多问题。但是,您不应该因此而使用它。 pimple 唯一真正的优势是二进制兼容性。

由于您不公开 STL 或除您自己的库之外的任何其他库,因此您不应该在 std::string 上出现链接错误。 . (是的,这是可能的)

如果你用 libc++ 编译你的库, std::string实际上是 std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >具有特定于 libcxx 的内存布局。

如果你用 libstdc++ 编译你的库, std::string变成 std::basic_string<char, std::char_traits<char>, std::allocator<char> > (或 C++11 变体的更长名称)

参见 this thread了解更多详情

关于c++ - 头文件如何安全地包含标准库供消费者导入它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54257950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com