C语言 extern “C“的作用

这篇具有很好参考价值的文章主要介绍了C语言 extern “C“的作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在看代码的时候遇到了这个问题。但是可能由于C++编译器版本的原因,我并没有成功地复现出这个问题,索性记录一下问题本身。

extern "C"主要是用于在Cpp文件中调用C的函数。

C++支持函数的重载,但是C不支持。

// CPP中由重载导致的函数魔改
int func(int x) {
   return x*x;
}
double func(double x) {
   return x*x;
}
void my_function(void) {
   int x = func(2); //integer
   double y = func(2.58); //double
}

C++编译器对这些同名不同参的重载函数的处理方法是,改写函数名,把参数信息体现在函数中。

int __func_i(int x){
   return x*x;
}
double __func_d(double x){
   return x*x;
}
void __my_function_v(void){
   int x = __func_i(2); //integer
   double y = __func_d(2.58); //double
}

注意到,这里的函数my_function即使没有重载,它也被魔改了。

当我们在C++代码中使用extern "C"时,C++编译器不会魔改你的函数名,而是按照C的规范进行编译。

extern "C"
{
     #include<stdio.h>    // Include C Header
     int n;               // Declare a Variable
     void func(int,int);  // Declare a function (function prototype)
}

int main()
{
    func(int a, int b);   // Calling function . . .
    return 0;
}

// Function definition . . .
void func(int m, int n)
{
    //
    //
}

上述代码中,extern "C"中包含的func的声明和定义不会被魔改。但是如果没有extern "C"的声明,C++编译器就会对对函数名下手了。文章来源地址https://www.toymoban.com/news/detail-605258.html

到了这里,关于C语言 extern “C“的作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C 语言里面的 extern “C“ ,并没有那么简单!

      本文详细解析 extern \\\"C\\\" 的底层原理与实际应用。 在你工作过的系统里,不知能否看到类似下面的代码。   这好像没有什么问题,你应该还会想: “ 嗯 ⋯ 是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~ ” 。 你说的没错,如果你的头文件从来没有被任

    2024年02月07日
    浏览(28)
  • C++之深入解析如何通过extern “C”关键字支持C语言

    C++ 语言的创建初衷是 “a better C”,但是这并不意味着 C++ 中类似 C 语言的全局变量和函数所采用的编译和连接方式与 C 语言完全相同。作为一种欲与 C 兼容的语言, C++ 保留了一部分过程式语言的特点(被称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变

    2024年02月02日
    浏览(32)
  • 【05】STM32·HAL库开发-C语言基础知识 | stdint.h介绍 | 位操作 | 宏定义的使用 | 条件编译 | extern声明 | typdef使用 | 结构体、指针、代码规范介绍。

      stdint.h 是从 C99 中引进的一个标准 C 库的文件,可以在MDK5的安装路径:D:MDK5.34ARMARMCCinclude中找到。   stdint.h 定义了很多类型别名,将有符号的char类型定义别名为int8_t等,使用此套别名有易于移植。   在MDK中需要配置才能支持使用S99标准, 默认是勾选的 。   只

    2024年02月08日
    浏览(33)
  • Go 语言变量作用域

    作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。 Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函数定义中的变量称为形式参数 接下来让我们具体了解局部变量、全局变量和形式参

    2024年02月09日
    浏览(27)
  • C语言--weak的作用

    weak 顾名思义是“弱”的意思,在汇编中, 在函数名称后面加[WEAK]来表示, 而在 C语言中,在函数名称前面加上__weak 修饰符来表示, 这样的函数我们称为“弱函数”。 被[WEAK]或__weak 声明的函数, 我们可以在自己的文件中重新定义一个同名函数,最终编译器编译的时候,会

    2024年02月16日
    浏览(18)
  • C语言【函数、作用域、常用系统函数】

    一、函数 1、函数的声明 ​自定义函数如果放在main函数之后,需要声明函数才可以访问到。如果未声明,则编译器会自动补一个返回类型未int类型的声明,这样以来,如果自定义函数返回值不为int,会报错。 ​结论:记得加函数声明。 2、函数的传值和传址。 todo 3、函数的

    2024年02月05日
    浏览(31)
  • 【C语言】函数(涉及生命周期与作用域)

    函数:是指程序中的实现某项特定需求的一小段代码 (容易跟数学上函数混淆),程序中函数翻译称为 子程序 。通常也称为 接口 ( 接口是内外连续的窗口,实现不同的功能和效果 ) 程序其实是由无数个小的函数组成,比如:我们编写 int main() 也是属于函数。函数就是运用\\\"大事

    2024年04月11日
    浏览(32)
  • Go语言代码块与作用域理解

    如果不深入理解 Go 语言的代码块作用域,程序将产生我们无法理解的行为,比如说在循环中创建 goroutine func, 为什么需要传递参数至 goroutine 内部,否则所有的 func 使用的变量参数都是循环的最后一个值。 看下边这个 demo, 就需要深入理解 Go 语言代码块的作用域才能理直气壮

    2024年02月11日
    浏览(29)
  • 在C语言中\t的作用

    t为转义字符。转义字符是一种特殊的字符常量。以反斜线\\\"\\\"开头,后跟字符。具有特定的含义,不同于字符原有的含义,故称“转义”字符。 【t】是 水平制表符 ,作用为补全前面字符串的位数到8的整数倍。若t前面没有字符/字符串,则在前面直接补8个空格;若前面有

    2024年02月05日
    浏览(22)
  • C语言变量的作用域,生命周期和链接相关

    本文介绍C语言的三个很重要的概念: 变量的作用域 变量的生命周期 变量或者函数的链接 先介绍一个概念: 翻译单元 C语言中有两种文件, 头文件.h , 代码文件.c 翻译单元指的是 包含头文件,并且将头文件展开以后的代码文件.c ,而每个翻译单元都有一个 文件作用域 ,实

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包