C&C++
发布时间:2022-04-03 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了extern "C":实现C++和C的混合编程,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
通过《
C语言和C++到底有什么关系?》一节的学习,读者已经了解了 C++ 和 C 语言之
间的关系。简单的理解,C++ 就是在 C 语言的基础上
增加了一些新特性,从大的方面讲,C++ 不仅
支持面向过程编程,还
支持面向对象编程和泛型编程;从小的方面讲,C++ 还
支持命名空间、
函数重载、内联
函数等。
在此基础上,很多读者都存在
一个疑问,即在
一个项目中,能否既包含 C++ 程序又包含 C 程序呢?换句话说,C++ 和 C 可以进行混合编程吗?
要知道,在 C++ 出现之前,很多实用的
功能都是用 C 语言开发的,很多底层的库也是用 C 语言编写的。这意味着,如果能在 C++
代码中兼容 C 语言
代码,无疑能极大地提高 C++ 程序员的开发效率。
而恰恰答案也正是我们想要的,C++ 和 C 可以进行混合编程。但
需要注意的是,由于 C++ 和 C 在程序的编译、
链接等方面都存在一定的差异,而这些差异往往会导致程序运行失败。
举个例子,如下就是
一个用 C++ 和 C 混合编程实现的实例项目:
//myfun.h
void display();
//myfun.c
#include <stdio.h>
#include "myfun.h"
void display(){
printf("C++:http://c.biancheng/net/cplus/");
}
//main.cpp
#include <iostream>
#include "myfun.h"
using namespace std;
int main(){
display();
return 0;
}
在此
项目中,主程序是用 C++ 编写的,而 display()
函数的定义是用 C 语言编写的。从表面上看,这个项目很完整,我们可以尝试运行它:
In function `main': undefined reference to `display()'
如上是
调用 GCC 编译器运行此项目时给出的
错误信息,指的是编译器无法找到 main.cpp
文件中 display()
函数的实现
代码。导致此
错误的原因,就
是因为 C++ 和 C 编译程序的方式存在差异。
通过学习《
C++函数重载》一节我们知道,之所以 C++
支持函数的重载,
是因为 C++ 会在程序的编译阶段对
函数的
函数名进行“再次
重命名”,例如:
-
void Swap(int a,int b) 会被重命名为
_Swap_int_int
;
-
void Swap(float x,float y) 会被重命名为
_Swap_float_float
。
显然通过
重命名,可以有效避免编译器在程序
链接阶段无法找到对应的
函数。
但是,C 语言是
不支持函数重载的,它不会在编译阶段对
函数的
名称做较大的改动。仍以 void Swap(
int a,int b) 和 void Swap(float x,float y) 为例,若以 C 语言的标准对它们进行编译,两个
函数的
函数名将都是
_Swap
。
这也就意味着,使用 C 和 C++ 进行混合编程时,
考虑到对
函数名的处理方式不同,势必会造成编译器在程序
链接阶段无法找到
函数具体的实现,导致
链接失败。
幸运的是,C++ 给出了
相应的解决方案,即借助 extern "C",就可以轻松
解决 C++ 和 C
在处理代码方式上的差异性。
extern "C"
extern 是 C 和 C++ 的
一个关键字,但对于 extern "C",读者大可以将其看做
一个整体,和 extern 毫无关系。
extern "C" 既可以修饰一句 C++
代码,也可以修饰一段 C++
代码,它的
功能是让编译器以处理 C 语言
代码的方式来处理修饰的 C++
代码。
仍以本节前面的实例项目来说,main.cpp 和 myfun.c
文件中都包含 myfun.h 头
文件,当程序进行预处理操作时,myfun.h 头
文件中的@L_
616_57@会被分别复制到这 2 个源
文件中。对于 main.cpp
文件中包含的 display()
函数来说,编译器会以 C++
代码的编译方式来处理它;而对于 myfun.c
文件中的 display()
函数来说,编译器会以 C 语言
代码的编译方式来处理它。
为了避免 display()
函数以不同的编译方式处理,我们应该使其在 main.cpp
文件中仍以 C 语言
代码的方式处理,这样就可以
解决函数名不
一致的问题。因此,可以像如下这样来@L_
197_70@ myfun.h:
#ifdef __cplusplus
extern "C" void display();
#else
void display();
#endif
可以看到,当 myfun.h 被引入到 C++ 程序中时,会选择带有 extern "C" 修饰的 display()
函数;反之如果 myfun.h 被引入到 C 语言程序中,则会选择不带 extern "C" 修饰的 display()
函数。由此,无论 display()
函数位于 C++ 程序还是 C 语言程序,都保证了 display()
函数可以按照 C 语言的标准来处理。
再次运行该项目,会发现之前的问题消失了,可以正常运行:
C++:http://c.biancheng/net/cplus/
在实际开发中,对于
解决 C++ 和 C 混合编程的问题,通常在头
文件中使用如下格式:
#ifdef __cplusplus
extern "C" {
#endif
void display();
#ifdef __cplusplus
}
#endif
由此
可以看出,extern "C" 大致有 2 种
用法,当仅修饰一句 C++
代码时,直接将其
添加到该
函数代码的开头即可;如果用于修饰一段 C++
代码,只需为 extern "C"
添加一对大括号
{}
,并将要修饰的
代码囊括到括号内
即可。大佬总结
以上是大佬教程为你收集整理的extern "C":实现C++和C的混合编程全部内容,希望文章能够帮你解决extern "C":实现C++和C的混合编程所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。