【发布时间】:2026-02-15 19:30:01
【问题描述】:
此问题旨在作为此问题的后续问题:What are the differences between a pointer variable and a reference variable in C++?
阅读了我在 * 上找到的答案和一些进一步的讨论后,我知道编译器应该像对待传递指针一样对待传递引用,并且引用只不过是语法糖。考虑到二进制兼容性,我还没有弄清楚一件事是否有任何区别。
在我们的(多平台)框架中,我们要求在发布版本和调试版本之间(以及框架的不同版本之间)二进制兼容。特别是,我们在调试模式下构建的二进制文件必须可用于发布版本,反之亦然。 为此,我们只在接口中使用纯抽象类和 POD。
考虑以下代码:
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer* pSerializer,
IException** __exception_ptr) = 0;
//[…]
};
ISerializer 和IException 也是纯抽象类。 ISerializer 必须指向一个现有的对象,所以我们总是必须执行一个 NULL 指针检查。 IException 实现了某种异常处理,其中指针指向的地址必须更改。出于这个原因,我们使用指向指针的指针,它也必须检查 NULL 指针。
为了使代码更清晰并摆脱一些不必要的运行时检查,我们希望使用 pass-by-reference 重写此代码。
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer& pSerializer,
IException*& __exception_ptr) = 0;
//[…]
};
这似乎没有任何缺陷。但这是否仍然满足二进制兼容性的要求仍然是我们的问题。
更新: 澄清一下:这个问题与代码的指针传递版本和引用传递版本之间的二进制兼容性无关。我知道这不能是二进制兼容的。事实上,我们有机会重新设计我们的 API,我们考虑使用传递引用而不是传递指针而不关心二进制兼容性(新的主要版本)。 问题只是仅使用代码的传递引用版本时的二进制兼容性。
【问题讨论】:
-
即使它是二进制兼容的,函数名也会有不同的错位,因此它不会链接。
-
澄清了问题,我希望问题现在清楚了。
-
POD 在 C++11 中消失了(完全分开):现在我们有了标准布局,它允许在课堂上发挥很大的作用。您可以像 POD 类型一样可靠地传递正则化的复杂对象。
标签: c++ pass-by-reference binary-compatibility pass-by-pointer interface-design