首页 > 编程语言 >C++ | extern "C" 的用法

C++ | extern "C" 的用法

时间:2023-08-03 18:55:44浏览次数:27  
标签:int C++ C语言 编译 func extern 用法

extern "C"是C++中的一种用法(无法在C语言中使用),其作用是 修饰一段代码,将其用C语言的方式进行编译。

那么,使用C语言方式进行编译与使用C++方式进行编译又有什么区别呢?

在C++中,支持函数重载:

void func();
void func(int a, int b);
void func(double a, float b);

但在C语言中如果编译函数func(),其在符号库中的名字为_func,也就是说与参数无关,只和函数名字相关。因此,C语言中无法实现函数重载,因为他们在符号库中的标识都是一样的。

而在C++中,一个函数编译后生成的名字是用函数名加上参数类型和数量构成的,比如void func(int a, int b)对应的名字是_func_int_int,而void func(double a, float b)对应的名字是_func_double_float,这样实际上就将名字相同的重载函数变成了不同的函数(编译过后)。

因此,extern "C" 的作用就显示出来了:实现C++与C语言的混合编程

代码一旦被extern "C"修饰之后,它便以C语言的方式工作(编译阶段:以C的方式编译;链接阶段:寻找C方式编译生成的符号)。 在C语言中引用 C++ 库的函数或 C++中引用 C 库的函数,都可以通过这个方式实现兼容。

  • 在C++中使用C语言库:

    // C++中的 <stdio.h> 有以下代码
    #ifdef __cplusplus
    extern "C" {
    #endif
     // ...
    #ifdef __cplusplus
    }
    #endif
    

    其中,宏定义__cplusplus是识别是否使用了C++进行编译的标志,这样一来,就可以在使用C++时直接调用C语言的库而不用担心使用C++的编译器无法编译C语言库的代码。

标签:int,C++,C语言,编译,func,extern,用法
From: https://www.cnblogs.com/C111111/p/17604189.html

相关文章

  • C++基础
    Talkischeap.Showmethecode.C++分为C++语言和C++标准库 版本演化可分为C++98(1.0),C++11(2.0),C++14话不多说,上代码头文件命名方式,例如complex.h首先要写防卫式声明,以前写的时候只是知道要写,现在知道才叫什么。1#ifndef_MYCOMPLEX_2#define_MYCOMPLEX_34......
  • Linux平台C++读写Word文档(DuckX库)
    1、安装cmake如果没有cmake或者cmake版本太旧,都需要进行重新安装此次推荐直接安装编译好的软件包进入官网:https://cmake.org/download/下载后直接在拷贝到系统里进行解压添加环境变量vim/etc/profile添加下面这条命令,路径换成自己安装的路径exportPATH=$PATH:/root......
  • c++
    1,2章输出printf(    输入scanf(一,变量通用形式<类型名><变量名>变量名=标识符(不能用数字开头,不能用关键字/保留字)前缀const【不变的】即锁定变量值(不允许改变)若变量要作为赋值则变量初始时要赋值(初始化) eg:inta; =》inta=0;二,浮点数类型名:int整点   do......
  • Activity之间数据交流一(startActivityForResult , onActivityResult , setResult 的用
    主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。这样的数据交流就要用到主Activity回调函数onActivityResult()。一些方法: 主Activity中:<1>主Activity......
  • UE5 unresolved external symbol 解决方案
    背景unresolvedexternalsymbol问题是模块代码使用了其他模块,build.cs文件中没有添加对这些模块的依赖问题Error LNK2001 unresolvedexternalsymbol"public:virtualvoid__cdeclUWidget::PreSave(classFObjectPreSaveContext)"(?PreSave@UWidget@@UEAAXVFObjectPreSaveCon......
  • 遵守 MISRA 如何提高C++应用的安全性
    Perforce在支持需要稳定和安全的应用程序方面有着悠久的历史。凭借50多年的应用程序开发经验,从客户、趋势和竞争对手那里学到了很多东西。Perforce从软件开发的所有领域都采用了最佳实践,并试图将这些实践应用于Perforce所做的一切。Perforce采用了单元测试、自动化测试、敏捷开......
  • curl常见用法以及查看响应时间
    curl是一个很强大的工具,支持模拟http请求,语法如下:curl[options][URL...]最简单的用法➜~curlhttp://www.baidu.com最常用法-H:代表header头-X:是指定什么类型请求(POST/GET/HEAD/DELETE/PUT/PATCH)-d:代表传输数据curl-H"Content-Type:application/json"-XPOST......
  • 如何在 React 18 中使用 useSyncExternalStore
    原文useSyncExternalStore是React18中提供的自定义挂钩,可让您订阅外部存储并在外部存储更新时更新您的React组件。它对于订阅不是建立在React状态管理之上的外部存储特别有用。useSyncExternalStoreAPI您应该在组件的顶层调用useSyncExternalStore方法import{useSyncExte......
  • C语言关键字extern。
    extern:声明变量是在其他文件正声明(也可以看做是引用变量):extern用在变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。//文件1代码#include<stdio.h>externvoidlbw();//声明外部lbw()intmain(){ lbw();}//文件2代码#include<stdio.h>voidlbw......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......