C++ 中的名称改编和 extern “C”
在 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
注意:这些代码块在不同的编译器中可能会产生不同的结果。
广告