0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言里extern "C" 是什么意思?

Q4MP_gh_c472c21 来源:CSDN博客 作者:CSDN博客 2020-09-07 11:09 次阅读

经常在C语言的头文件中看到下面的代码:

#ifdef__cplusplus extern"C"{ #endif //allofyourlegacyCcodehere #ifdef__cplusplus } #endif

这通常用于C++和C混合编程的时候,为了防止C++的编译器在编译C文件的时候出现错误;众所周知,C++可以进行函数名重载,但是C则没有这种功能,那这和extern "C"又有什么关系呢?
先看下面这个表格,如下所示;

未添加 extern "C"

test.h

#ifndefTEST_H #defineTEST_H voidfoo1(void); voidfoo2(void); voidfoo3(inti); #endif

test.c

voidfoo1(void){} voidfoo2(void){} voidfoo3(inti){} intmain(intargc,char**argv){ foo1(); foo2(); foo3(1); return0; }

编译这两个文件,生成test.o文件,通过objdump查看函数符号;

g++-ctest.ctest.h objdump-ttest.o

可以看到函数符号已经被编译器修改了;

添加extern "C"

test.h

#ifndefTEST_H #defineTEST_H #ifdef__cplusplus extern"C"{ #endif voidfoo1(void); voidfoo2(void); voidfoo3(inti); #ifdef__cplusplus } #endif #endif

test.c

#ifdef__cplusplus extern"C"{ #endif voidfoo1(void){} voidfoo2(void){} voidfoo3(inti){} #ifdef__cplusplus } #endif intmain(intargc,char**argv){ foo1(); foo2(); foo3(1); return0; }

编译这两个文件,生成test.o文件,通过objdump查看函数符号;

g++-ctest.ctest.h objdump-ttest.o

这时候函数符号是正确的;

extern "C"是告诉C++的编译器不要打我这些C函数的主意。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7522

    浏览量

    127425

原文标题:长见识:你真的知道C语言里extern "C" 的作用吗?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C/C++语言extern的用法

    现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程,里面含有A.cpp和B.cpp两个简单的C++源文件。
    的头像 发表于 11-29 14:34 320次阅读

    C语言中如何调用其他.c文件的函数?

    比如我main.c要调用A.c的a_init()
    发表于 10-25 08:00

    请问C语言extern通常怎么使用?

    C语言extern通常怎么使用?哪位大神指点一下。
    发表于 10-08 10:55

    C语言在计算机领域中不可替代

    C语言
    YS YYDS
    发布于 :2023年07月02日 17:44:40

    C语言面试必备30问

    C语言
    YS YYDS
    发布于 :2023年06月21日 00:30:13

    链表的函数(2)#C语言程序设计进阶

    C语言
    学习硬声知识
    发布于 :2023年05月31日 15:48:08

    链表(2)#C语言程序设计进阶

    C语言
    学习硬声知识
    发布于 :2023年05月31日 15:47:19

    链表(1)#C语言程序设计进阶

    C语言
    学习硬声知识
    发布于 :2023年05月31日 15:46:50

    联合(2)#C语言程序设计进阶

    C语言
    学习硬声知识
    发布于 :2023年05月31日 15:46:21

    联合(1)#C语言程序设计进阶

    C语言
    学习硬声知识
    发布于 :2023年05月31日 15:45:56

    结构类型(3)#C语言程序设计进阶

    C语言
    学习硬声知识
    发布于 :2023年05月31日 15:45:30

    结构中的结构(2)#C语言程序设计进阶

    C语言
    学习硬声知识
    发布于 :2023年05月31日 15:41:18

    第23集(4.4#100)) extern 必须要加!《十天登顶嵌入式C语言之巅(高手C)》百集大课

    嵌入式C语言
    于振南的单片机世界
    发布于 :2023年05月29日 22:23:59