gpt4 book ai didi

c++ - 导出模板代码 = 危险? (MSVC)

转载 作者:行者123 更新时间:2023-11-30 01:01:00 27 4
gpt4 key购买 nike

正如我在另一个 SO 问题中指出的那样,我遇到了 this article .当我通过 MSVC7.1 编译 boost 1.40 时出现了这个问题,并且弹出了几个 C4251 警告。

现在,在阅读上述文章后,我想知道:是否通常不鼓励导出模板代码,例如

class DLLEXPORT_MACRO AClass
{
public:
std::vector<int> getVecCopy() { return myVec; }
...
}

假设这段代码通过 MSVC7.1 编译成一个 DLL。虽然从其他 MSVC7.1 代码引用此代码时不会产生任何错误,但据说在 MSVC8 代码中引用此 DLL 会产生运行时崩溃(内存对齐问题?)。

因为这显然是不好的...什么是处理导出模板代码问题的“最佳实践”?

最佳答案

这似乎是个坏主意,因为 std::vector 在编译器版本之间不同或可能不同。但是,这可能会在加载时失败,因为 std::vector 的名称修饰在编译器版本之间应该不同(这是名称修饰的部分原因)。

这种链接时故障是您作为开发人员无法真正强制执行的,除非购买支持它的编译器。另一种解决方案是将模板类型完全排除在 DLL 接口(interface)之外。将它们放入私有(private)成员中。

请注意,该问题并非模板所独有。想象一下 std::string 是一个 UDT 而不是 typedef,由编译器运行时提供。它仍然可以在编译器版本之间发生变化,当然在编译器供应商之间也可​​能发生变化。它在 DLL 接口(interface)中仍然不可用。

由于这些原因,实际的解决方案是 0. 使用 C,1. 使用 COM 或 2. 选择单一的编译器版本。

关于c++ - 导出模板代码 = 危险? (MSVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1578215/

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