0%

Cpp extern用法解析

[TOC]

C++调用C函数

C++保留了一部分过程式语言的特点,但更重要的是C++是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。下面会对C++的重载overload说明一下。

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。

加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。

比如说你用C 开发了一个动态链接库,为了能够让C++语言也能够调用你的函数,你需要用extern "C"来强制编译器不要修改你的函数名。

通过例子来说明

标准头文件

1
2
3
4
5
6
7
8
#ifndef __TEST_H  /*防止该头文件被重复引用*/
#define __TEST_H


// some declaration


#endif /* __TEST_H */

这个头文件,对于标准的C程序是没有任何问题的,编译/链接/调用。

改进头文件

但是如果使用C++来调用上面的一些定义函数,就会出现undefined error,这就是由于C++函数重载的原因。

解决方法就是下面的头文件,使用extern "C"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __TEST_H  /*防止该头文件被重复引用*/
#define __TEST_H

#ifdef __cplusplus //__cplusplus是cpp中自定义的一个宏
extern "C" { //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的
#endif

// some declaration

#ifdef __cplusplus
}
#endif

#endif /* __TEST_H */

extern “C”的含义

extern "C"代表两方面的意思,extern以及C,也就是说被其修饰的函数是可以被外部调用的,并且是C的函数定义。

C和C++的区别

由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。

比如,同一个函数

1
void add(int x,int y);

c编译后在符号库中的名字为_add,C++中为_add_int_int,可以看到C++中包含了函数名/函数参数数量及类型信息,这也是为什么C++能重载的原因。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道