首页 > 后端开发 > C++ > 正文

名称混淆和extern "C"在C++中

WBOY
发布: 2023-08-29 10:21:11
转载
1171 人浏览过

名称混淆和extern "C"在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
登录后复制

注意:这些代码块可能在不同的编译器中生成不同的结果。

以上是名称混淆和extern "C"在C++中的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:tutorialspoint.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!