【发布时间】:2019-06-12 22:52:33
【问题描述】:
假设我想创建以下类:
#pragma once
#include <memory>
#include <string>
namespace stackquestion
{
struct Logger
{
void Log(std::string message);
private:
class Impl;
std::unique_ptr<Impl> impl;
};
}
当我想发布课程时,我最终取决于我的消费者对std::string 和std::unique_ptr 的定义。我对发布的含义含糊不清。我正在考虑给某人一个用于静态或动态链接的库。
当我退回到没有这些内容的版本时,我最终会失去我想要获得的舒适/安全。
#pragma once
namespace stackquestion
{
struct Logger
{
void Log(const char *);
private:
class Impl * impl;
};
}
我是否缺少灵丹妙药?
【问题讨论】:
-
标准库的好处在于它是 standard 库。所有符合 C++ 的编译器都会有它。
std命名空间中的类不是您的消费者,而是它们的 C++ 编译器。 -
如果消费者有一个自定义的
<memory>或<string>会破坏您的代码,那是他们的问题,而不是您的问题。你保证你的代码是符合标准的,你可以免除任何责任。 -
我的代码符合当时的版本。
std::string过去发生了变化,使得在翻译单元之间传递时可能发生堆栈损坏。所有参与者都符合某些要求,堆栈已损坏。 -
@Johannes 如果这将是一个 DLL,那么你是对的,你不应该传递标准容器:stackoverflow.com/questions/5347355/…
-
@Johannes All 链接在一起的目标文件、库等应该总是(当然存在例外,但作为一般规则)构建使用 exact same 编译器 - 这意味着相同的标准库。 C++ 从未保证编译器和编译器版本之间的二进制兼容性。