在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++中的详细内容。更多信息请关注PHP中文网其他相关文章!