PiJ*_*PiJ 4 c++ interface-design pass-by-reference binary-compatibility pass-by-pointer
这个问题是作为这个问题的后续问题:C++中指针变量和引用变量之间有什么区别?
阅读了我在stackoverflow上找到的答案和一些进一步的讨论后,我知道编译器应该像处理pass-by-pointer一样对待pass-by-reference,而引用只不过是语法糖.考虑到二进制兼容性,如果存在任何差异,我还无法弄清楚一件事.
在我们的(多平台)框架中,我们要求在发布和调试版本之间(以及框架的不同版本之间)进行二进制兼容.特别是,我们在调试模式下构建的二进制文件必须可用于发布版本,反之亦然.为此,我们只在接口中使用纯抽象类和POD.
请考虑以下代码:
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer* pSerializer,
IException** __exception_ptr) = 0;
//[…]
};
Run Code Online (Sandbox Code Playgroud)
ISerializer并且IException也是纯粹的抽象类.ISerializer必须指向现有对象,因此我们总是必须执行NULL指针检查.IException实现某种异常处理,其中指针指向的地址必须改变.出于这个原因,我们使用指向指针的指针,指针也必须是NULL指针.
为了使代码更清晰并省去一些不必要的运行时检查,我们希望使用pass-by-reference重写此代码.
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer& pSerializer,
IException*& __exception_ptr) = 0;
//[…]
};
Run Code Online (Sandbox Code Playgroud)
这似乎没有任何缺陷.但问题仍然是我们是否仍然满足二进制兼容性的要求.
更新: 澄清事情:这个问题不是关于代码的pass-by-pointer版本和pass-by-reference版本之间的二进制兼容性.我知道这不能是二进制兼容的.事实上,我们有机会重新设计我们的API,我们考虑使用pass-by-reference而不是pass-by-pointer而不关心二进制兼容性(新的主要版本).问题只是关于仅使用代码的pass-by-reference版本的二进制兼容性.