在C++中我们可以使用函数重载特性。利用这个特性,我们可以创建同名的函数。唯一的区别是参数的类型和参数的数量。这里不考虑返回类型。现在的问题是,C++如何区分目标代码中的重载函数?
在目标代码中,它通过添加有关参数的信息来更改名称。这里应用的技术称为名称修改。 C++ 没有标准化的名称重整技术。因此不同的编译器使用不同的技术。
下面是名称重整的示例。重载函数被命名为 func(),还有另一个函数 my_function()。
示例
int func(int x) {
return x*x;
}
double func(double x) {
return x*x;
}
void my_function(void) {
int x = func(2); //integer
double y = func(2.58); //double
}
登录后复制
某些 C++ 编译器会像下面这样更改它 -
示例
int __func_i(int x) {
return x*x;
}
double __func_d(double x) {
return x*x;
}
void __my_function_v(void) {
int x = __func_i(2); //integer
double y = __func_d(2.58); //double
}
登录后复制
C不支持函数重载,所以当我们在C++中链接C代码时,我们必须确保符号的名称没有改变。以下 C++ 代码将生成错误。
示例
int printf(const char *format,...);
main() {
printf("Hello World");
}
登录后复制
输出
undefined reference to `printf(char const*, ...)'
ld returned 1 exit status
登录后复制
产生此问题的原因是编译器更改了 printf() 的名称。并且它没有找到更新后的 printf() 函数的定义。为了解决这个问题,我们必须在C++中使用extern“C”。当此块内使用某些代码时,C++ 编译器会确保函数名称未被破坏。所以这个名字不会改变。所以上面的代码就会像这样来解决这个问题。
示例
extern "C" {
int printf(const char *format,...);
}
main() {
printf("Hello World");
}
登录后复制
输出
Hello World
登录后复制
注意:这些代码块可能在不同的编译器中生成不同的结果。
以上就是名称混淆和extern "C"在C++中的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!