3

可能重复:
在 C++ 中,函数重载通常是如何实现的?

我正在阅读 bruce eckel 的书,OOPS其中说明了如何处理重载函数,以防它们在返回值和传递的参数上有差异。


int fun() :: could be represented as __int__fun
float fun():: could be represented as __float__fun
int fun(int a):: as _int _fun_int

但是在c中的块的情况下重载如何工作

               {
                  void fun(){}
                  ...........
                  ..
                  fun()
               }
               /......sme code/
               {
                   void fun(){}
               }

谁能解释这在内部是如何表示的?

4

4 回答 4

4

在块内定义函数在 C++ 中是不合法的。

如果我们想象一下这样的事情是合法的,那么你的两个函数仍然没有重载。它们只是具有不重叠的范围。您的示例与此示例没有什么不同:

  {
     int i;
     ...
  }
  {
     int i;
     ...
  }

这里没有“重载变量”,您的示例中也没有重载函数。

于 2012-04-07T14:02:38.670 回答
1

在 C 中,不同块中具有相同名称的两个函数的命名如下:

functionName.number

例如,您可能有:

fun.2051

fun.2053

我通过使用以下命令编译 C 程序来解决这个问题:

gcc -S -o test.asm test.c

然后我打开汇编文件并观察 gcc 用什么标记函数。

于 2012-04-07T16:57:21.817 回答
0

块只能发生在函数内部。C++ 不支持/允许嵌套函数(即,一个函数定义在另一个函数中),所以这个问题永远不会出现。

如果它被允许(例如,像 gcc 这样的编译器作为扩展),你仍然不会重载。重载要求两个(或多个)具有相同基本名称的实体在同一范围内可见。在这种情况下,每个名称都将在一个单独的范围内,在这种情况下不会发生重载——您只需进行正常的范围查找,它会从匹配的最本地范围中找到名称。

编辑:顺便说一句,我还应该补充一点,与您所展示的相反,函数的返回类型可能通常不包含在损坏/修饰的名称中——函数重载取决于函数“签名”,它包括参数类型,但包括返回类型。

于 2012-04-07T14:02:56.213 回答
0

在 C++ 的编译过程中如何在内部表示重载函数

谷歌“C++名称修改”。它将被表示为具有类似名称的普通函数writeCDATA@QXmlStreamWriter@@QAEXABVQString@@@Z

但是在块的情况下重载如何工作

您的代码示例不包含有效的 C++ 代码,因此无法编译。

于 2012-04-07T14:04:16.903 回答