C语言与C++语言相互调用

                                                                                     C语言与C++语言相互调用

1 C++调用C中的函数

 

1.1 C++调用C中的函数(正确使用)

 

1、案例源文件组成

C语言与C++语言相互调用_第1张图片

                                              图1

 

2、math模块包含文件

 

1)源文件math.c

C语言与C++语言相互调用_第2张图片

                                              图2

2)头文件math.h

C语言与C++语言相互调用_第3张图片

                                                     图3

 

3、主模块包含文件

 

1)源文件main.cpp

 

C语言与C++语言相互调用_第4张图片

                                                        图4

2)头文件module.h

 

C语言与C++语言相互调用_第5张图片

                                                     图5

 

4、编译math模块

 

C语言与C++语言相互调用_第6张图片

                                                                 图6

 

5、编译主模块

 

C语言与C++语言相互调用_第7张图片

                                                                   图7

6、链接

 

C语言与C++语言相互调用_第8张图片

                                                            图8a

 

 

                                                               图8b

 

 

 

1.2 C++调用C中的函数(非正确使用)

1、案例源文件组成

C语言与C++语言相互调用_第9张图片

                                                           图9

 

2、math模块包含文件

1)源文件math.c

C语言与C++语言相互调用_第10张图片

                                                          图10

2)头文件math.h

C语言与C++语言相互调用_第11张图片

                                                             图11

 

 

 

3、主模块包含文件

1)源文件main.cpp

C语言与C++语言相互调用_第12张图片

                               图12

2)头文件module.h

C语言与C++语言相互调用_第13张图片

                                                        图13

图13与图5内容差异为:图13屏蔽了exterrn “C” {}

 

4、编译math模块

C语言与C++语言相互调用_第14张图片

                                                                     图14

 

5、编译主模块

C语言与C++语言相互调用_第15张图片

                                                                                 图15

图15与图7中内容差异:图7中的函数符号为add_func,而图15中的函数符号为_Z8add_funcii

因C++为面向对象语言,存在多态性,在编译时会将函数参数类型和个数一并加入符号中,其中_Z8add_funcii中的ii为表示有两个参数,并且参数类型为integer型。

6、链接

C语言与C++语言相互调用_第16张图片

                                                                 图16

 

 

 

 

2 C调用C++中的函数

 

2.1 C调用C++中的函数(正确使用)

 

1、源码结构

C语言与C++语言相互调用_第17张图片

                                                 图1

 

2、math模块

1)math.h文件

C语言与C++语言相互调用_第18张图片

                                      图2

2)math.cpp

C语言与C++语言相互调用_第19张图片

                             图3

3)编译math模块

                                                                  图4

 

4)查看math.o中符号内容

 

C语言与C++语言相互调用_第20张图片

                                                                图5

3、主模块

1)module.h

C语言与C++语言相互调用_第21张图片

                                 图6

2)main.c

C语言与C++语言相互调用_第22张图片

                                       图7

3)编译主模块

                                                          图8

4)查看main.o中符号

C语言与C++语言相互调用_第23张图片

                                                              图9

4、链接(math.o和main.o)

C语言与C++语言相互调用_第24张图片

                                                           图10

 

2.2 C调用C++中的函数(非正确使用)

1、源文件结构

C语言与C++语言相互调用_第25张图片

                                               图1

2、math模块

1)math.h文件

C语言与C++语言相互调用_第26张图片

                             图2

2)math.cpp文件

C语言与C++语言相互调用_第27张图片

                             图3 

3)编译math模块

                                                          图4

4)查看math.o中的符号

 

C语言与C++语言相互调用_第28张图片

                                                                 图5

 

3、主模块

1)module.h

C语言与C++语言相互调用_第29张图片

                                       图6

2)main.c

C语言与C++语言相互调用_第30张图片

                                     图7

3)编译主模块

                                                   图8

4)查看main.o中符号

C语言与C++语言相互调用_第31张图片

                                                              图9

 

4、链接(math.o和main.o)

 

                                                        图10 

 

 

 

 

3 总结

C++保留了一部分过程式语言特点,因此可以定义不属于任何类的全局变量和函数;但是C++为面向对象语言,支持函数的重载,C++对全局函数处理方式明显与C不同。extern “C”{}目的是为了让C++正确使用C的代码,加上extern “C”{}之后,会指示编译器对这部分代码按照C语言进行编译,而不是C++语言进行编译。C++支持多态,因此编译过程中会将函数的参数类型合入函数名符号中,而不仅仅是函数名。

__cplusplus为cpp中自定义的宏,extern表明变量和函数是全局性的。

主意:

1)C++调用一个C语言编写的.so库时,包含描述.so库中函数的头文件时,应该将对应的头文件放置在extern “C”{}格式的{}中,。

2)C中引用C++中的全局函数时,C++的头文件需要加extern “C”,而C文件中不能用extern “C”,只能使用extern关键字。

你可能感兴趣的:(Linux,C,编程)