c++ - 在 C++ 中更改参数名称时的二进制兼容性

标签 c++ binary-compatibility

我有一个关于更改成员函数的参数名称的问题。

我有函数 foo(type iA) 然后我改成 foo(type iB),我认为它是 bin comp,但我不确定。

能帮我解释一下原因吗?非常感谢!

最佳答案

当然它是二进制兼容的,因为你不改变对象的类型。因此大小保持不变。变量名称仅供人类使用。

您实际上可以声明函数而不提供任何名称,例如:

int funct(void*, int, Object)

当你定义它时,你可以使用任何你喜欢的东西

int funct(void* ptr, int something , Object object){return 42;};

没关系。它也适用于类(class)成员。

二进制兼容性或不兼容性的(我会说主要原因)原因是传递的对象的大小。因此,当您对实际二进制数据进行操作时,在汇编程序级别上,偏移量不会发生变化。如果更改类型,参数将位于内存中的不同位置,并且需要重新计算它们的偏移量。重要的是地址,而不是别名或名称。

编辑:

为了完整性。 正如@Lightness 指出的那样,您还可以跳过定义中的名称,因此我给出的示例可能如下所示:int funct(void*, int, Object){return 42;};

还有关于@James 的评论。我会说,当两个物体的大小相同时,它就会变得模糊。当然,从一种类型到另一种类型进行如此疯狂的转换是没有意义的。然而,考虑到前面的例子,如果你不使用操作数,它可能会工作......在汇编程序级别。如果大小不同,则会损坏堆栈。

但是,当我想到如何评论这个问题时,我告诉自己,你问的是c++。那么我们从这个角度来看。我会说当函数的签名 没有改变时,函数是二进制兼容的。在任何定义中,操作数的名称都不是它的一部分。函数签名是名称重整和重载的基础,也是最终二进制对象中的符号名称。

关于c++ - 在 C++ 中更改参数名称时的二进制兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972711/

相关文章:

c++ - 多线程和模板化单例竞争条件

c++ - 读取内存时发生访问冲突

com - VB6 IDE 正在锁定加载项目的 DLL

c - 如何创建向后兼容的动态链接?

C++ 虚拟继承 : static_cast "this" to virtual parent in initializer list of derived

c++ - cuda和c++问题

c++ - 在 C++ 中的函数定义中混合指针和引用

java - 是什么导致了 java.lang.IncompatibleClassChangeError?

c++ - 与 C++11 `enum class` 的 ABI 兼容性保留

c++ - 将纯虚拟更改为虚拟并保持二进制兼容