1

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

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

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

4

2 回答 2

3

参数的名称只是为了让您区分参数。您可以在函数声明和函数定义中使用不同的名称。

所以这没关系:

void foo(int bar);  // Declare function

...

// Define function
void foo(int bibibibibi)
{
    ...
}

上面的声明和定义是针对同一个函数的。C++ 不会基于参数名称覆盖或重载函数,仅基于参数类型。

编译器不存储参数(或其他变量)的名称,除非作为调试信息。实际生成的代码没有关于变量名称的信息。

于 2013-11-14T08:26:46.360 回答
3

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

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

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++. 那么让我们从这个角度来看。我会说函数在签名不变时是二进制兼容的。在任何定义中,操作数的名称都不属于它的一部分。函数签名是名称修改和重载的基础,也是最终二进制对象中的符号名称。

于 2013-11-14T08:26:53.530 回答