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

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

3天内不再提示

你真的知道C语言里extern C有什么作用吗

奈因PCB电路板设计 来源:小麦大叔 作者:菜刀和小麦 2021-08-17 09:35 次阅读

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

#ifdef __cplusplus extern “C” { #endif // all of your legacy C code here #ifdef __cplusplus } #endif

这通常用于C++和C混合编程的时候,为了防止C++的编译器在编译C文件的时候出现错误;

众所周知,C++可以进行函数名重载,但是C则没有这种功能,那这和extern “C”又有什么关系呢?

先看下面这个表格,如下所示;

语言 描述
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

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

添加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

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

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

好了,这次分享的比较简单,也挺实用,我们下期再见。

END

作者:菜刀和小麦

来源:小麦大叔

版权归原作者所有,如有侵权,请联系删除。

编辑:jq

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

    关注

    21

    文章

    2084

    浏览量

    73262
  • 代码
    +关注

    关注

    30

    文章

    4655

    浏览量

    67694
  • 编译器
    +关注

    关注

    1

    文章

    1600

    浏览量

    48877
  • c函数
    +关注

    关注

    0

    文章

    11

    浏览量

    7495

原文标题:你真的知道C语言里extern“C”的作用吗?

文章出处:【微信号:pcbgood,微信公众号:奈因PCB电路板设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    按照这样学习C语言,成为卷王不是梦!

    在计算机编程领域,C语言被誉为一种强大而灵活的编程语言,掌握好C语言不仅可以让轻松驾驭各种编程
    的头像 发表于 07-06 08:04 179次阅读
    按照这样学习<b class='flag-5'>C</b><b class='flag-5'>语言</b>,成为卷王不是梦!

    plc编程语言c语言的联系 c语言和PLC什么区别

    语言,主要用于开发各种应用程序。尽管PLC编程语言C语言一些相似之处,但它们之间也存在一些明显的区别。 首先,PLC编程
    的头像 发表于 02-05 14:21 2958次阅读

    c语言,c++,java,python区别

    C语言C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言
    的头像 发表于 02-05 14:11 1270次阅读

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举在C语言中是一种常见的数据类型,用于定义一组相互关联的常量或者变量。它通常用于表示一系列可能
    的头像 发表于 01-19 14:19 425次阅读

    C/C++语言extern的用法

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

    C语言运行环境是什么

    C语言运行环境(C language runtime environment)是指在执行C语言程序时所需的软件及硬件环境。
    的头像 发表于 11-27 16:13 2756次阅读

    如何选择创建c语言c++

    选择创建 C 语言C++ 都需要综合考虑多个因素。在决定使用哪种语言之前,我们需要对这两种语言的特点、优缺点、适用场景、学习成本等进行全
    的头像 发表于 11-27 15:58 430次阅读

    visualc++怎么新建c语言文件

    ++ 中新建 C 语言文件的步骤如下: 打开 Visual C++ IDE:首先,需要打开 Visual C++ 集成开发环境。
    的头像 发表于 11-27 15:57 2670次阅读

    C语言printf函数族学习笔记

    printf 应该是学习C语言的第一个函数,我们都知道它是用于字符串格式化输出的。但是它的用法真正了解了吗?
    的头像 发表于 11-24 11:15 732次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>printf函数族学习笔记

    scanf在C语言中的作用

    scanf在C语言中的作用  scanf是C语言中的输入函数,用于从标准输入设备(如键盘)读取数据,并将其存储到变量中。它是
    的头像 发表于 11-23 14:13 910次阅读

    C语言中链表的作用是什么?

    C语言中指针用的很少,链表、文件操作几乎没用过,所以也不能理解到底什么作用。各位经常在做程序时会用到这些吗。
    发表于 11-06 06:23

    C语言中关键词extern用法的一个注意事项

    在做项目开发时,在一个单片机C语言程序(用keil开发)中
    的头像 发表于 11-02 14:42 412次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中关键词<b class='flag-5'>extern</b>用法的一个注意事项

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

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

    C语言指针讲解

      C语言可以说是工科学生必不可少的编程语言了,尤其是嵌入式的应用中C语言更是大厦之基,甚至在我的评价
    发表于 10-01 13:25 215次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>指针讲解

    知道共模电感中间的隔板什么作用

    共模电感作为一种常见的电感类型,它在电路中的作用主要是用于滤除噪声和防止电磁干扰。对共模电感熟悉的人应该知道,共模电感中间通常会有一个小小的隔板,那么知道这个隔板
    的头像 发表于 09-24 09:52 628次阅读