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++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73480
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68324
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49043
  • c函数
    +关注

    关注

    0

    文章

    11

    浏览量

    7512

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

    C语言哪些预处理操作?

    C语言的预处理是在编译之前对源代码进行处理的阶段,它主要由预处理器完成。预处理器是一个独立的程序,它负责对源代码进行一些文本替换和处理,生成经过预处理的代码。以下是C语言预处理的一些重
    的头像 发表于 12-08 15:40 581次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>有</b>哪些预处理操作?

    C语言C++中那些不同的地方

    C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言C
    的头像 发表于 12-07 14:29 902次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>和<b class='flag-5'>C</b>++中那些不同的地方

    C/C++语言extern的用法

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

    常用的c语言开发环境哪些

    C语言是一种广泛应用于系统编程、嵌入式开发和科学计算等领域的高级编程语言。为了能够高效地开发C语言程序,我们需要一个适用的开发环境。下面将介
    的头像 发表于 11-27 16:14 5619次阅读

    C语言运行环境是什么

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

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

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

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

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

    c语言a++和++a的区别举例

    使用"++"运算符。相应地,"--"运算符也有类似的行为。 在C语言中,"++"运算符的作用是将变量的值增加1,而"--"运算符的作用是将变量的值减少1。这两个运算符可以用于任何可以修
    的头像 发表于 11-26 09:09 3958次阅读

    C语言printf函数族学习笔记

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

    c语言gets函数可以输入数字吗

    C语言中的gets函数是用来读取字符串的,而不是用来读取数字的。它会读取输入的字符直到遇到换行符或者文件结束符。因此,如果尝试使用gets函数来读取数字,是无法准确获取数字本身的。 首先,让我们
    的头像 发表于 11-24 10:00 1438次阅读

    scanf在C语言中的作用

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