你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言里extern "C" 的作用

[复制链接]
gaosmile 发布时间:2020-8-24 21:38
经常在C语言的头文件中看到下面的代码:
#ifdef __cplusplus
extern "C" {
#endif

// all of your legacy C code here

#ifdef __cplusplus
}
#endif
这通常用于C++和C混合编程的时候,为了防止C++的编译器在编译C文件的时候出现错误;
众所周知,C++可以进行函数名重载,但是C则没有这种功能,那这和extern "C"又有什么关系呢?
先看下面这个表格,如下所示;
[td]
语言
描述
C函数名可以作为唯一ID代码段的程序建立联系
C++因为重载的关系,函数名符号会被破坏,从而会根据函数的参数不同而重新生成函数符号
未添加 extern "C"
test.h
#ifndef TEST_H
#define TEST_H

void foo1(void);
void foo2(void);
void foo3(int i);

#endif
test.c

void foo1(void){}
void foo2(void) {}
void foo3(int i){}

int main(int argc,char** argv){

foo1();
foo2();
foo3(1);
return 0;
}

编译这两个文件,生成test.o文件,通过objdump查看函数符号;
g++ -c test.c test.h
objdump -t test.o
可以看到函数符号已经被编译器修改了;
微信图片_20200824213328.png 添加extern "C"
test.h
#ifndef TEST_H
#define TEST_H

#ifdef __cplusplus
extern "C" {
#endif
void foo1(void);
void foo2(void);
void foo3(int i);

#ifdef __cplusplus
}
#endif

#endif
test.c
#ifdef __cplusplus
extern "C" {
#endif
void foo1(void){}
void foo2(void) {}
void foo3(int i){}
#ifdef __cplusplus
}
#endif

int main(int argc,char** argv){

foo1();
foo2();
foo3(1);
return 0;
}

编译这两个文件,生成test.o文件,通过objdump查看函数符号;
g++ -c test.c test.h
objdump -t test.o
这时候函数符号是正确的;
微信图片_20200824213331.png
extern "C" 是告诉C++的编译器不要打我这些C函数的主意。


收藏 3 评论0 发布时间:2020-8-24 21:38

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版