我有一个关于更改成员函数的参数名称的问题。
我有功能foo(type iA)
然后我改为foo(type iB)
,我认为它是 bin comp,但我不确定。
你能帮我解释一下原因吗?非常感谢!
我有一个关于更改成员函数的参数名称的问题。
我有功能foo(type iA)
然后我改为foo(type iB)
,我认为它是 bin comp,但我不确定。
你能帮我解释一下原因吗?非常感谢!
参数的名称只是为了让您区分参数。您可以在函数声明和函数定义中使用不同的名称。
所以这没关系:
void foo(int bar); // Declare function
...
// Define function
void foo(int bibibibibi)
{
...
}
上面的声明和定义是针对同一个函数的。C++ 不会基于参数名称覆盖或重载函数,仅基于参数类型。
编译器不存储参数(或其他变量)的名称,除非作为调试信息。实际生成的代码没有关于变量名称的信息。
当然,它将是二进制兼容的,因为您不会更改对象的类型。因此大小保持不变。变量名称仅供人类使用。
您实际上可以声明不提供任何名称的函数,例如:
int funct(void*, int, Object)
当你定义它时,你可以使用任何你喜欢的东西
int funct(void* ptr, int something , Object object){return 42;};
没事。它也适用于班级成员。
二进制兼容性或不兼容的(我会说主要)原因是传递对象的大小。因此,当您对实际的二进制数据进行操作时,在汇编程序级别上没有偏移量发生变化。如果您更改类型,参数将位于内存中的不同位置,并且需要重新计算它们的偏移量。重要的是地址而不是别名或名称。
编辑:
为了完整性。正如@Lightness 指出的那样,您也可以跳过定义中的名称,所以我给出的例子可能看起来:int funct(void*, int, Object){return 42;};
.
还有关于@James 的评论。我会说,当两个对象的大小相同时,它会变得模糊不清。当然,从一种类型到另一种类型进行如此疯狂的转换是没有意义的。但是,考虑到前面的示例,如果您不使用操作数,它可能会工作......在汇编程序级别。如果大小不同,则会损坏堆栈。
但是,当我想到如何评论这个问题时,我告诉自己,你问的是c++
. 那么让我们从这个角度来看。我会说函数在签名不变时是二进制兼容的。在任何定义中,操作数的名称都不属于它的一部分。函数签名是名称修改和重载的基础,也是最终二进制对象中的符号名称。