extern "c" 的作用

作用:实现C和C++混合编程。

原理:C和C++编译器编译之后,函数名会编译成不同的名字,链接阶段名字查找会找不到目标,后面实例中会详解。

用法:①.c文件中定义的函数,.cpp文件要调用时,该.cpp文件中要用extern "C"声明该函数;②反过来,.cpp文件中定义的函数,.c文件要调用,则同样要在.cpp文件中用extern "C"声明,.c文件只用普通的extern声明。

两个源文件分别编译成.o文件,再链接成执行文件。链接.o文件生成执行文件时,必须得用g++。

实例:

在源文件中声明的,没有头文件

.c文件定义的函数,.cpp文件调用:

1 //.c文件定义的函数
2 extern int myadd(int a, int b);
3
4 int myadd(int a, int b)
5 {
6     return a+b;
7 }
 1 //.cpp文件调用
 2 #include <iostream>
 3 using namespace std;
 4
 5 extern "C" int myadd(int a, int b);
 6
 7 int main()
 8 {
 9     cout << myadd(3, 7) << endl;
10     return 0;
11 }

.cpp文件定义的函数,.c文件调用:

1 //.cpp文件定义的函数
2 extern "C" int myadd(int a, int b);
3
4 int myadd(int a, int b)
5 {
6     return a + b;
7 }
 1 //.c文件调用
 2 #include <stdio.h>
 3
 4 extern int myadd(int a, int b);
 5
 6 int main()
 7 {
 8     printf("%d\n", myadd(3, 7));
 9     return 0;
10 }

如果在头文件中声明,则.c文件正常的包含该头文件,.cpp文件应该用

1 //.cpp文件的包含方式
2 extern "C"
3 {
4     #include "myHead.h"
5 }

的方式来包含头文件,该头文件中声明的函数都为C方式编译。

原理补充:C文件中,上述函数编译之后的函数名为类似于_myadd的形式,而CPP的编译之后函数名为类似于_myadd_int_int的形式,因为CPP要支持重载,用这种方式来区别重载的函数。

时间: 2024-11-07 22:58:33

extern "c" 的作用的相关文章

C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern &quot;C&quot;的作用

调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法. 1.__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2._cdecl是C和C++程序的缺省调用方式.每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大.函数采用

extern “C”的作用详解

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的.由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名:而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名. 这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了

第2例——extern关键字的作用

1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是[

extern “C”的作用

1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++保留了一部分过程 式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支 持函数的重载,C++对全局函数的处理方式与C有明显的不同. 2.从标准头文件说起 某企业曾经给出如下的一道面试题: 面试题 为什么标准头文件都有类似以下的结

extern C的作用具体解释

转载于:http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html 1.引言 C++语言的创建初衷是"a better C".可是这并不意味着C++中类似C语言的全局变量和函数所採用的编译和连接方式与C语言全然同样.作为一种欲与C兼容的语言. C++保留了一部分过程式语言的特点(被世人称为"不彻底地面向对象").因而它能够定义不属于不论什么类的全局变量和函数. 可是,C++毕竟是一种面向对象的程

extern &quot;c&quot;的作用详解

extern "c"的主要作用就是为了能够正确实现C++代码调用其它C语言代码.加上extern "c"后,会指示编译器这部分代码按照C语言的风格进行编译.         由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名:C语言并不支持函数重载,因此编译C代码的函数时不会带上函数的参数类型,一般只包括函数名. 这个功能十分有用,因为在C++出现以前,很多代码都是C语言写的,而且底层的库也是C语言写的,为了更

extern关键词的作用

extern关键词有两个用途: 1. extern "C“ 表示修饰的函数是在C中定义的,告诉编译器编译时按照C的规则来编译.这是由于C++为了实现函数的重载,在编译时会将函数翻译为函数名加参数的形式,例如void foo( int x, int y );会被翻译成类似_foo_int_int的样子,不同的编译器格式不同,但原理类似.那么在C++中调用C的函数时,会找不到C中的函数,因为在C中该函数被翻译成了_foo之类的形式.为了能够在C++中兼容C,所以在include头文件时,需要加上ex

DLL编写中extern “C”和__stdcall的作用

动态链接库的使用有两种方式,一种是显式调用.一种是隐式调用. (1)       显式调用:使用LoadLibrary载入动态链接库.使用GetProcAddress获取某函数地址. (2)       隐式调用:可以使用#pragma comment(lib, “XX.lib”)的方式,也可以直接将XX.lib加入到工程中. DLL的编写 编写dll时,有个重要的问题需要解决,那就是函数重命名——Name-Mangling.解决方式有两种,一种是直接在代码里解决采用extent”c”._dec

const/static/extern/self/super

一 .const 和 宏 的区别 const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 编译时刻:宏是预编译(编译之前处理),const是编译阶段. 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误. 宏的好处:宏能定义一些函数,方法. const不能. 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换. 注意: 有很多博客(Blog)描述宏时,说使用宏会消耗很多内存,这种说法并不正确.它并不会生