[C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
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++相关推荐
- 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 ...
- [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++中有不同的变量 ...
- 爱上MVC3系列~分部视图中的POST
在PartialView中进行表单提交,有什么用呢,我来总结一下: 1 这个表单不只一个地方用到 2 可能涉及到异步的提交问题 这两种情况都有可能需要把表单建立在"分部视图"中,我 ...
- ML:MLOps系列讲解之系列知识解读全貌
ML:MLOps系列讲解之系列知识解读全貌 导读:您将了解如何使用机器学习,了解需要管理的各种变更场景,以及基于ml的软件开发的迭代性质.最后,我们提供了MLOps的定义,并展示了MLOps的发展. ...
- 面试准备系列01----面试中的链表题目汇总
面试准备系列01----面试中的链表题目汇总 九月份立即就要校招了,感觉时间非常是捉急啊~~~~白天要实习,就仅仅 ...
- linux设置共享权限设置命令,Linux系列知识详解(三)--------- Linux链接命令和权限管理命令...
Linux系列知识详解(三)--------- Linux链接命令和权限管理命令 一:链接命令ln 简介:什么是链接命令?链接命令分为软链接和硬链接.其中软链接产生的新文件是以路径的形式表示原文件,类 ...
- springboot socket服务端_SpringBoot2.x系列教程81--SpringBoot中整合WebSockets
SpringBoot2.x系列教程81--SpringBoot中整合WebSockets 作者:一一哥 一. WebSockets简介 1. 什么是WebSockets WebSocket是HTML5 ...
- exchange无法收发邮件_SpringBoot2.x系列教程69--SpringBoot中整合Mail实现邮件发送
SpringBoot2.x系列教程69--SpringBoot中整合邮件发送 作者:一一哥 注: 本文案例以QQ邮箱发送的实现为例! 一. 邮件发送概述 1. 概述 在Spring框架中提供了一个Ja ...
- STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)
STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级) STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级) ...
最新文章
- kernel vim阅读 设置tags的标签
- 【 Verilog 】always@()的敏感源中为什么不能双边沿触发?为什么不能双时钟触发?
- Codeforces Round #344 (Div. 2)C. Report
- mysql -u -p -d_mysqld_exporter监控mysql
- linux asm 磁盘管理,asm磁盘管理篇
- 因为没钱买衣服,我女朋友不要我了......
- java将pdf转换为jpg图片格式
- 小白可以来看看磁盘与文件管理实验
- 合肥工业大学机器人足球仿真robcup作业一(python实现)附代码有注释
- APT(Android Performance Testing Tools)安卓平台高效性能测试工具
- 码云新建仓库-代码上传
- Full Convert相互转换器,转换数据库格式简单的方法
- [英语]ab/abs/ac/acr词根讲解
- 我与电脑2-高中时期
- 地理商业智能发展浅析
- ***腾讯云直播(含微信小程序直播)研究资料汇总-原创
- 符合SEO标准的div+css页面参考
- Wolfram|Alpha Notebook Edition中文快速入门指南(可下载)
- 迁移学习一、基本使用
- CVPR 2023 接收结果出炉!再创历史新高!录用2360篇!(附10篇最新论文)
热门文章
- App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!
- 连接mysql报错:Access denied for user ‘root’@‘localhost’(using password: YES)的解决方法
- echo输出到stderr
- 如何通过索引从列表中删除元素?
- 计算机等级ms答题演示,计算机等级一级MS Office考试考题:第六套演示文稿题
- php josnp_浅析php中jsonp的跨域实例
- bloom-generate 打包 ros 版本 noetic 的包及报 /usr/bin/ld: 找不到 -lpthreads与undefined reference pthread_create
- ros之service通讯
- 全向轮机器人左向直线运动分析
- Car-like Robot运动模型及应用分析