重载是通过对函数进行“重整”(name mangling,又叫名字粉碎,命名修饰等)实现的。其实现的方法为:编译器根据函数的不同的参数表,对同名函数的名称做修饰,对于编译器而言,这些同名函数就成了不同的函数,他们的调用地址在编译期就绑定了。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。例如有这样一个函数:
int func(int x, int y);
int func(char x, int y);
经过编译后,函数变成为:
@func_int4int4
@func_char1int4
从此处可以看出,如果把返回值也做为一个可区别的特征话,即:
int func(int x, int y);
char func(int
x, int y);
那么在做如下调用的时候:
int a, b;
func(a, b);
由于在语句中根本没包含返回值,就无法区别不同的重载函数了。
此外,如果在C++程序中要引用C语言编写的库和函数,必须加上extern “C”说明。这是为什么呢?
在C语言中,由于没有重载机制,所以C编译器并不对函数进行重整,即不加相应的修饰符。如果不加extern “C”,那么C++就会对其中的函数进行重整,从而找不到相关的正确的函数体。只有加了之后,C++才不会对其进行重整,因此才能按照C的格式调用,使用对应的C代码。
Copyright 2011-2020 © MallocFree. All rights reserved.