
在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++ 编译器会像下面这样更改它 -
立即学习“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++中的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号