extern "C"的作用

extern "C"的作用

#include "stdafx.h"
#include <iostream>
using namespace std;

#if 0

----extern "C"的作用:

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

在cpp文件中实现的函数,c文件若要调用,就必须在cpp文件中用extern "C"来声明该函数,
否则cpp在编译过程中就会对其进行名字改编,c文件就找不到该函数的原型

由于C、C++编译器对函数的编译处理是不完全相同的,尤其对于C++来说,支持函数的重载,
编译后的函数一般是以函数名和形参类型来命名的。例如函数void fun(int, int),编译后
的可能是(不同编译器结果不同)_fun_int_int(不同编译器可能不同,但都采用了类似的机
	制,用函数名和参数类型来命名编译后的函数名);而C语言没有类似的重载机制,一般是
	利用函数名来指明编译后的函数名的,对应上面的函数可能会是_fun这样的名字


----使用情景:

这个功能主要用在下面的情况:
1、C++代码调用C语言代码
2、在C++的头文件中使用
3、在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到

----设计例子:

moduleA、moduleB两个模块,B调用A中的代码,其中A是用C语言实现的,
而B是利用C++实现的,下面给出一种实现方法:

//moduleA.h
#ifndef __MODULE_A_H 

#define __MODULE_A_H

int fun(int, int);

#endif

//moduleA.c

#include"moduleA"

int fun(int a, int b)
{
	return a + b;
}

//moduleB.h

#ifndef __MODULE_B_H 

#define __MODULE_B_H

//而这一部分就是告诉编译器,如果定义了__cplusplus(即如果是cpp文件,则采用C语言方式进行编译

#ifdef __cplusplus  //(cpp文件默认定义了该部分)
extern "C"
{
#include"moduleA.h"
#endif  //对应宏__cplusplus


其他代码...


#ifdef __cplusplus
}
#endif  //对应宏__cplusplus

#endif  //对应防止重复编译的宏


//moduleB.cpp
#include"moduleB.h"

int main()
{
	cout << fun(2, 3) << endl;
}


----extern "C"的使用要点:

1. 可以是单一语句
extern "C" double sqrt(double);

2. 可以是复合语句, 相当于复合语句中的声明都加了extern "C"
extern "C"
{
	double sqrt(double);
	int min(int, int);
}

3.可以包含头文件,相当于头文件中的声明都加了extern "C"
extern "C"
{
#include <cmath>
}

例:在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern "C"
{
#include "cExample.h"
}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,
在.c文件中包含了extern "C"时会出现编译语法错误

如果C++调用一个C语言编写的.DLL时,当包括DLL的头文件或声明接口函数时,应加extern "C"{}


4. 不可以将extern "C" 添加在函数内部

5.在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引
用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型
(也就是说extern"C"只能存在在c++文件中,而不能存在c文件中)

6. 如果函数有多个声明,可以都加extern "C", 也可以只出现在第一次声明中,
后面的声明会接受第一个链接指示符的规则。

7. 除extern "C", 还有extern "FORTRAN" 等。


#endif

int main()
{
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SwordArcher/article/details/81508625
今日推荐