http://www.geeksforgeeks.org/extern-c-in-c/

C++函数重载(function overloading),但是C++编译器是如何区分不同的函数的呢?----是通过在函数名是加些信息来区不同的函数,即所谓的Name Mangling。C++标准并没有对name mangling技术,各个编译器可以添加不同的信息。

考虑下面的函数

int  f (void) { return 1; }
int  f (int)  { return 0; }
void g (void) { int i = f(), j = f(0); }

C++编译器也许会重命名为 (Source: Wiki)

int  __f_v (void) { return 1; }
int  __f_i (int)  { return 0; }
void __g_v (void) { int i = __f_v(), j = __f_i(0); }

C++链接器如何处理C语言中的符号呢?

C语言不支持函数重载,所以没有name mangling技术,那么在C++中使用了C函数后如何保证C++链接器能够正取的链接呢?

// Save file as .cpp and use C++ compiler to compile it
int printf(const char *format,...);int main()
{printf("GeeksforGeeks");return 0;
}

编译结果:

diego@ubuntu:~/myProg/geeks4geeks/cpp$ g++ test11.cpp
test11.cpp:1:2: error: invalid preprocessing directive #int#int printf(const char *format,...);^
test11.cpp: In function 'int main()':
test11.cpp:5:29: error: 'printf' was not declared in this scopeprintf("GeeksforGeeks\n");^
diego@ubuntu:~/myProg/geeks4geeks/cpp$

编译错误的原因是C++编译器对printf函数进行了name mangling,然后找不到重命名后的函数的符号。解决办法就是使用extern "C" 关键字。

// Save file as .cpp and use C++ compiler to compile it
extern "C"
{int printf(const char *format,...);
}int main()
{printf("GeeksforGeeks");return 0;
}

输出结果:

diego@ubuntu:~/myProg/geeks4geeks/cpp$ g++ test11.cpp
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out
GeeksforGeeks

所以,所有的C语言的库函数都要包含在extern “C” block中。

#ifdef __cplusplus
extern "C" {
#endif/* Declarations of this file */
#ifdef __cplusplus
}
#endif

[C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++相关推荐

  1. c语言编译成功,[C/CPP系列知识] 那些程序C语言可以编译通过但C++无法编译成功 Write a C program that won’t compile in C++...

    下面的程序可以用gcc编译,但g++无法编译. #include intmain() { foo();//foo() is called before its declaration/definiti ...

  2. [C/CPP系列知识] Type difference of character literals 和 bool in C and C++

    C/C+中的每一个常亮(every literal)都是有类型的,例如10 就是int型的,因此siziof(10)和sizeof(int)是相同的,但是字符型常亮('a')在C和C++中有不同的变量 ...

  3. 爱上MVC3系列~分部视图中的POST

    在PartialView中进行表单提交,有什么用呢,我来总结一下: 1 这个表单不只一个地方用到 2 可能涉及到异步的提交问题 这两种情况都有可能需要把表单建立在"分部视图"中,我 ...

  4. ML:MLOps系列讲解之系列知识解读全貌

    ML:MLOps系列讲解之系列知识解读全貌 导读:您将了解如何使用机器学习,了解需要管理的各种变更场景,以及基于ml的软件开发的迭代性质.最后,我们提供了MLOps的定义,并展示了MLOps的发展. ...

  5. 面试准备系列01----面试中的链表题目汇总

                                               面试准备系列01----面试中的链表题目汇总 九月份立即就要校招了,感觉时间非常是捉急啊~~~~白天要实习,就仅仅 ...

  6. linux设置共享权限设置命令,Linux系列知识详解(三)--------- Linux链接命令和权限管理命令...

    Linux系列知识详解(三)--------- Linux链接命令和权限管理命令 一:链接命令ln 简介:什么是链接命令?链接命令分为软链接和硬链接.其中软链接产生的新文件是以路径的形式表示原文件,类 ...

  7. springboot socket服务端_SpringBoot2.x系列教程81--SpringBoot中整合WebSockets

    SpringBoot2.x系列教程81--SpringBoot中整合WebSockets 作者:一一哥 一. WebSockets简介 1. 什么是WebSockets WebSocket是HTML5 ...

  8. exchange无法收发邮件_SpringBoot2.x系列教程69--SpringBoot中整合Mail实现邮件发送

    SpringBoot2.x系列教程69--SpringBoot中整合邮件发送 作者:一一哥 注: 本文案例以QQ邮箱发送的实现为例! 一. 邮件发送概述 1. 概述 在Spring框架中提供了一个Ja ...

  9. STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级) STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级) ...

最新文章

  1. kernel vim阅读 设置tags的标签
  2. 【 Verilog 】always@()的敏感源中为什么不能双边沿触发?为什么不能双时钟触发?
  3. Codeforces Round #344 (Div. 2)C. Report
  4. mysql -u -p -d_mysqld_exporter监控mysql
  5. linux asm 磁盘管理,asm磁盘管理篇
  6. 因为没钱买衣服,我女朋友不要我了......
  7. java将pdf转换为jpg图片格式
  8. 小白可以来看看磁盘与文件管理实验
  9. 合肥工业大学机器人足球仿真robcup作业一(python实现)附代码有注释
  10. APT(Android Performance Testing Tools)安卓平台高效性能测试工具
  11. 码云新建仓库-代码上传
  12. Full Convert相互转换器,转换数据库格式简单的方法
  13. [英语]ab/abs/ac/acr词根讲解
  14. 我与电脑2-高中时期
  15. 地理商业智能发展浅析
  16. ***腾讯云直播(含微信小程序直播)研究资料汇总-原创
  17. 符合SEO标准的div+css页面参考
  18. Wolfram|Alpha Notebook Edition中文快速入门指南(可下载)
  19. 迁移学习一、基本使用
  20. CVPR 2023 接收结果出炉!再创历史新高!录用2360篇!(附10篇最新论文)

热门文章

  1. App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!
  2. 连接mysql报错:Access denied for user ‘root’@‘localhost’(using password: YES)的解决方法
  3. echo输出到stderr
  4. 如何通过索引从列表中删除元素?
  5. 计算机等级ms答题演示,计算机等级一级MS Office考试考题:第六套演示文稿题
  6. php josnp_浅析php中jsonp的跨域实例
  7. bloom-generate 打包 ros 版本 noetic 的包及报 /usr/bin/ld: 找不到 -lpthreads与undefined reference pthread_create
  8. ros之service通讯
  9. 全向轮机器人左向直线运动分析
  10. Car-like Robot运动模型及应用分析