首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么要使用'extern'C++"'?

在C++中,extern "C" 是一种链接声明,用于告诉编译器当前的代码将会与其他编程语言编写的代码进行交互。这是因为C++支持函数重载,因此在编译时会对函数名进行修改以支持重载。而C语言并不支持函数重载,因此在链接时可能会出现问题。

使用 extern "C" 可以告诉C++编译器使用C语言的链接约定,这样就可以在C++代码中调用C语言编写的函数了。这是非常重要的,因为许多现有的库和API都是用C语言编写的,因此在C++项目中需要使用 extern "C" 来调用这些函数。

例如,在C++代码中调用C语言的 printf 函数时,可以这样声明:

代码语言:cpp
复制
extern "C" int printf(const char* format, ...);

这样就可以在C++代码中使用 printf 函数了。

总之,extern "C" 是一种告诉编译器如何链接其他语言编写的代码的方法,它可以让C++代码与其他编程语言的代码进行交互,从而实现更广泛的应用场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【面试宝典】c调用c++函数,为什么extern c

首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。...),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对C的函数是怎样编译的: 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。...函数被C++编译后在符号库中的名字与C语言的不同。...未加extern "C"声明时的连接方式 假设在C++中,模块A的头文件如下: // 模块A头文件 moduleA.h #ifndef MODULE_A_H #define MODULE_A_H int...我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C++与C及其它语言的混合编程。  ----

1.9K140
  • C和C++混合编译,externextern C

    当你引用一个全局变量时,你就要声明extern int a;这个时候extern不能省,否则就成定义了。...被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目的:实现C++与C的混合编程。...(2) C中引用C++语言中的函数或者变量时,C++的头文件需要加上extern “C”,但是C语言中不能直接引用声明了extern “C”的该头文件,应该仅在C中将C++中定义的extern “C”函数声明为...C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,...第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用

    3.5K11

    C++为什么引入nullptr

    这使得在使用 nullptr 时更具有类型安全性,避免了使用整数 0 或 NULL 时可能引起的混淆和错误。 2. 消除二义性: 在 C 和 C++ 中,NULL 是一个表示空指针的宏。...在 C 中,通常在 头文件中定义,而在 C++ 中,可以在 头文件中找到。...在 C++ 中,NULL 通常被定义为整数零,而在 C 中,它通常被定义为一个空指针常量表达式。这样的定义能够在 C 和 C++ 代码中都能正常工作。...在某些情况下,使用整数 0 或 NULL 可能导致重载函数调用时的二义性,因为它们可能匹配多个重载版本。使用 nullptr 可以在这些情况下清晰地表达出空指针。...在现代 C++ 编程中,使用 nullptr 是一种良好的实践,有助于提高代码的可读性和类型安全性。

    16610

    C++extern声明的外部变量 | 使用extern输出

    C++外部变量 上一节有读者咨询extern是什么,这节主要用来解释一下externC++中的用法,外部变量在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。...编译时将全局变量分配在静态存储区,有时需要用extern来声明全局变量,以扩展全局变量的作用域。 C++文件内声明全局变量  如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。...用extern扩展全局变量的作用域,虽然能为C++编码带来方便,但应十分慎重,因为在执行一个文件中的函数时,可能会改变了该全局变量的值,从而会影响到另一文件中的函数执行结果。...经典案例:C++实现用extern对外部变量作引用声明。...C++使用extern输出 更多案例可以go公众号:C语言入门到精通

    2.6K2828

    C++ 语言】 C 与 C++ 兼容 ( extern C )

    选择项目类型 : 选择创建 “CMake 项目” , 在 Android 中主要使用的也是 CMake 配置 NDK C/C++ 代码 ; 3....add_subdirectory ("001_CMake_1") ---- C++ 中直接调用 C 代码 ( 无法解析的外部符号 错误 ) C++ 向下兼容 : C 中大部分代码都可以在 C++ 中直接使用...FFMPEG 等都是 C语言的库 , 因此这里就需要用到 C 与 C++ 的兼容 ; ④ 兼容方法 : 使用 extern “C”{} 指定让大括号中的内容 以 C 语言的方式进行编译 ; 这样才能在...在引用处使用 : extern “C” {} 可以写在 引用 头文件的位置 , 如下 : // 001_CMake_1.cpp: 定义应用程序的入口点。...宏 : 该宏定义在 C++ 编译器中 , 如果是 C 语言编译器 , 就不会定义该宏 ; ② 使用效果 : 如果在 C++ 编译环境中 , extern “C” { 和 } 生效 , 在 C 语言编译环境中

    2.7K30

    C++extern 数组和指针

    在一次使用 extern 声明全局变量的过程中,因为数组和指针的混用引发了错误。 我们知道,C++使用 extern 来声明在其他(未使用 include 包含的)文件中的全局变量。...通过上述分析,我们得到的最重要的结论是:使用 extern 修饰的变量在链接的时候只找寻同名的标号,不检查类型,所以才会导致编译通过,运行时出错。...extern int i = 0;:定义,extern 可以省略,i 可以在其他文件中使用extern int i;:声明,i 在其他文件中定义。 int i:定义,分配了空间但未初始化。...extern const int i = 0:定义,i 是全局变量,可以在其他文件中使用为什么有 include 还需要 extern?...因此如果是多个文件链接在一起的情况,通常是在 cpp 文件中定义全局变量,而在另外一个 cpp 文件中使用时通过 extern 声明该变量。

    40800

    C++为什么引入智能指针?

    ​智能指针的必要性C++ 引入智能指针主要是为了解决手动管理动态分配内存时可能出现的几个问题,特别是内存泄漏、野指针和异常安全等问题。...常见的内存泄漏场景和解决方法一、常见内存泄漏场景忘记释放内存: 场景描述:在C++中,使用new或malloc等函数动态分配内存后,如果忘记在适当的位置使用delete或free释放这些内存,就会导致内存泄漏...示例:int* ptr = new int[100]; // 分配内存后忘记delete[] ptr;错误使用new和delete: 场景描述:在释放使用new[]分配的内存时,错误地使用delete而不是...使用智能指针时,只需要关注对象的使用,不需要手动管理内存。使用内存泄漏检测工具: 使用如Valgrind、Purify等内存检测工具来检测程序中的内存泄漏问题。...通过优化内存使用方式和改进代码结构来减少内存泄漏的风险。总结总之,C++ 引入智能指针是为了更好地管理动态分配的内存,减少内存泄漏、野指针和异常安全等问题,提高代码的安全性和可靠性。

    8010

    不找C++的工作,为什么学习C++

    C++的实际意义主要表现在哪儿? 或许好的C++编程开发人员,找个高薪工作是做的到的。这算作用之一。这又是许多人为什么挑选语言编程的原因。其实我很想问,假如编程并不是高薪职位,还会有几个去学?...你会那样的来扪心自问:不要看一切C++的书,对1个搞不懂计算机的人讲叙C++代表什么?你能想起多少C++的东西?你能顺理成章的给他们解释需不需要有面向对象这类编程思想?...4:模板机制:函数模板,类模板 5:它的标准库STL里边的数据结构和算法,那些內容你关键是要了解他们有哪些实现方案,尽管不必你去写,只是你明白来源,那样用起来才放心。...这些具体内容它帮你写好啦,你好多时候我觉得仅仅在使用接口罢了。因此,熟悉它,是一件简单的事。重要是探索它的实现方案。 7:做好多个项目,包含控制台的,图形化的,及其进一步延伸的QT编程。...它是一种境地,这个境地并不是靠看了几本书、背了多少语法就能达到的,而是思索,理解,联想学习、時刻明白了怎么去融汇贯通… 574669dc0001993606000338.jpg 学通编程,

    2.2K40

    必须使用extern的场景

    困惑 即使不使用extern,在头文件中定义的全局变量,也可以被引用了该头文件的外部源文件使用。那extern存在的意义是什么?它要解决什么问题?...代码示例 test.h #ifndef __TEST1_H #define __TEST1_H int kVar = 1; // 测试不使用extern // extern int kVar; void...结论 一开始提到的困惑是 “即使不使用extern,在头文件中定义的全局变量,也可以被引用了该头文件的外部源文件使用”。对于全局变量仅被单个.cpp文件使用的情况,可以不使用extern。...而extern解决的问题是,多个.cpp文件使用同一个全局变量时,使用extern可以使该全局变量在头文件中仅声明而不定义。再让唯一一个.cpp文件定义该变量,实现仅定义一次全局变量。

    51460

    编写dll时,为什么extern “C”

    编写dll时,为什么extern “C” 原因:因为C和C++的重命名规则是不一样的。...如果DLL里的函数重命名规则跟DLL的使用者采用的重命名规则不一致,那就会找不到这个函数。 影响符号名的除了C++和C的区别、编译器的区别之外,还要考虑调用约定导致的Name Mangling。...注意到extern “C”的作用是为了解决函数符号名的问题,这对于动态链接库的制造者和动态链接库的使用者都需要遵守的规则。...分两步: 一,如果导出函数使用extern”C” _cdecl,那么就不需要再重命名了,这个时候dll里的名字就是原始名字;如果使用extern”C” _stdcall,这时候dll中的函数名被修饰了...默认情况下VC使用的是__cdecl的函数调用方式,如果产生的dll只会给C/C++程序使用,那么就没必要定义为__stdcall调用方式,如果要给Win32汇编使用(或者其他的__stdcall调用方式的程序

    2.5K10

    C++为什么引入异常处理机制

    例如,使用C标准库的宏断言assert()作为出错处理的方法。在开发过程中,使用这个宏进行必要的条件检测,项目完成后可以使用#define NDEBUG来禁用断言assert()。...由于信号产生库的使用者必须理解和安装合适的信号处理,所以使用上述两个函数进行错误处理时应紧密结合各信号产生库。对于大型项目而言,不同库之间的信号可能会产生冲突。...因此C++的异常处理就在这个背景下产生的。C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制。...C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关...---- [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[P353-P355] [2]百度百科.setjmp [3]C++的异常处理

    1.1K10

    C++为什么弄出虚表这个东西?

    C++编译器实际会帮你生成一个类似上例中C语言写法二的形式。这也算是C++ zero overhead(零开销)原则的一个体现。...输出: height:168 weight:50 age:20 height:168 weight:50 age:20 这是为什么呢?...指针实际指向的还是子类对象的内存空间,可是为什么不能调用到子类的desc()?这个就是我在第一部分说过的:类的数据(成员变量)和操作(成员函数)其实是分离的。...好了,现在我们对于C++如何应用多态有了一定的了解,那么多态又是如何实现的呢? 终于我们谈到虚表 C++具体多态的实现一般是编译器厂商自由发挥的。...但无独有偶,使用虚表指针来实现多态几乎是最常见做法(基本上已经是最好的多态实现方法)。

    51110

    C++ 中命名 Mangling 和 extern “C”

    C++ 链接时如何处理 C 符号? 在 C 中,名称可能不会被修改,因为它不支持函数重载。那么当我们在 C++ 中链接 C 代码时,如何确保符号的名称不被更改。...例如,请参阅以下使用 C 的 printf() 函数的 C++ 程序。 ...解决方案:  C++ 中的 Extern “C” 当一些代码被放入 extern “C” 块时,C++ 编译器确保函数名是未修改的——编译器发出一个名称不变的二进制文件,就像 C 编译器会做的那样。...main() { printf("haiyong"); return 0; } 输出 haiyong 因此,所有 C 风格的头文件(stdio.h、string.h 等)在 extern...为了避免链接问题,C++ 支持 extern “C” 块。C++ 编译器确保 extern “C” 块内的名称不会更改。

    1.2K40

    C++extern关键字知识点

    C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,...3)、这提示我们,在使用extern时候严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。   ...4 问题:extern “C”   在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?   ...6. extern 和 static  (1) extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量....7. extern 和const    C++中const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中,但是const可以与extern连用来声明该常量可以作用于其他编译模块中

    1K40

    深入理解extern使用方法

    extern “C”限定的函数或变量是extern类型的: extern是C/C++语言中表明函数和全局变量作用范围(可见性)的keyword,该keyword告诉编译器,其声明的函数和变量能够在本模块或其他模块中使用...与extern相应的keyword是static,被它修饰的全局变量和函数仅仅能在本模块中使用。因此。一个函数或变量仅仅可能被本模块使用时。其不可能被extern “C”修饰。...l extern “C”的惯使用方法 (1)在C++中引用C语言中的函数和变量,在包括C语言头文件(如果为cExample.h)时。...(2)在C中引用C++语言中的函数和变量时,C++的头文件需加入extern”C”,可是在C语言中不能直接引用声明了extern”C”的该头文件。...应该仅将C文件里将C++中定义的extern”C”函数声明为extern类型。 三、 extern 和static (1)extern表明该变量在别的地方已经定义过了。在这里要使用那个变量。

    44810
    领券