C++是在C的基础上发展起来的。当咱们用C++写项目工程的时候,颇有可能之前的许许多多的代码都是用C语言写的。那么,当咱们用C++编译程序的时候,以前用C写的代码就放弃不用了吗?固然不可能。若是工程量浩大,直接放弃以前用C写的程序从新用C++写一遍耗时又耗力,更况且C++自诞生以来就有一个重大的使命——兼容C语言。更况且以前用C写的代码是通过检验的可使用的代码,难道就能由于如今用C++来写工程,以前写的彻底能够运行的大量C代码就不用了吗?很显然,不愿能吧。
那么,有人就会感到疑惑了。C++ 既然天生就是可以兼容C语言的,那么用C++编译器编译C语言彻底是能够经过的啊。难道不对吗?对的,彻底正确。若是是源码,那么C++编译器彻底能够经过运行。可是,若是一段程序是用C写的,这段代码已经被编译成了目标文件,那么还能再用C++编译经过吗?显然,已经不行了。关于这点的实际使用就是,咱们在C++程序里面会用到一些第三方的库,而这些库是用C语言编写并编译的。
因此,咱们在实际工程中,必须得让C++代码可以使用C语言编写的库。
接下来,咱们用一个简单的例子来讲明,咱们上面阐述的内容。
首先,咱们先来写一个简单的函数,该函数在add.c这个文件中实现。这个函数实现相加功能(喂喂喂,怎么写这么简单的一个函数啊?说明原理用不着举一个很深奥的例子吧,啊哈哈哈)c++
int add ( int a, int b ){ return a + b; }
接下来,咱们再写一个头文件,用来声明咱们所写的函数。ide
int add ( int a, int b );
而后,咱们能够通过编译生成一个目标文件。
这个add.o文件就是咱们编译后生成的。
而后,咱们要开始编写主程序。函数
int main ( int argc, char** argv ){ printf ( "sum = %d\n", add ( 2, 3 ) ); system ( "pause" ); return 0; }
这段主程序被保存在main.cpp这个文件中。接下来,咱们来编译运行程序。
编译后,咱们发现,程序报错了。错误信息提示说,咱们没有声明这个函数,但是咱们明明声明了呀,这是为何呢?咱们能够先来查看一下,add.o文件中到底有没有add函数。
通过查看后,咱们发现,add.o中确实是有add函数的啊。
那么,很明显,因为咱们上面的操做,这个add.o文件是用C语言编译器编译出来的。而这个main.cpp是用C++编译器编译。因此,咱们直接想用C++编译器使用C编写的目标代码就会报错。
假如咱们在实际工程中,有大量的第三方库都是用C编写的,而咱们用的确实c++语言,编译器也是用的C++编译器,那这个用C语言写的第三方库咱们就不用了吗?固然不是,确定会有解决方案。怎么解决呢?
extern关键字能强制让C++编译器进行C方式的编译。
那么,咱们在C++文件中,加上这么段代码,就能够告诉编译器,其中的C代码要用C方式编译。3d
extern "C" { #include "add.h" }
这样以来,咱们就告诉编译器,咱们用extern包含的头文件中的代码是C代码,咱们要用C编译器来编译它。
下面上main.cpp中的完整代码:code
#include <stdio.h> #include <stdlib.h> extern "C" { #include "add.h" } int main ( int argc, char** argv ){ printf ( "sum = %d\n", add ( 2, 3 ) ); system ( "pause" ); return 0; }
而后,咱们再来编译一下。
运行以后,咱们发现,编译经过,而且运行结果正确。
由上面这个例子,咱们又引出一个问题:咱们如何保证一段代码始终以C的方式被编译。可能有部分大佬以为,刚刚不是才学过吗,用extern。那么很差意思大佬,我得告诉你,extern在C++中才支持,在C中就不支持了。
不信的话,大佬们,咱们一块儿来实验一下。首先,咱们来定义一个main.c文件。blog
#include <stdio.h> #include <stdlib.h> extern "C" { #include "add.h" } int main ( int argc, char** argv ){ printf ( "sum = %d\n", add ( 2, 3 ) ); system ( "pause" ); return 0; }
运行以后,咱们发现,
程序报错了。
上面这段不符合C的规则,由于extern但是C++的写法。(大佬们这下应该相信小生说的话了吧)
那么,咱们怎么作才能保证这段代码既能被C++编译过又能被C编译过?解决方案固然是有的啦。若是没有,我就不在这里吹牛B了,啊哈哈哈。怎么作呢?
经过使用C++编译器内置的一个标准宏_cplusplus。经过这个标准宏咱们能够判断该编译器是不是C++编译器。
接下来,咱们来实际使用一下:编译器
#ifdef _cplusplus extern "c" { #endif #include "add.h" #ifdef _cplusplus } #endif
咱们只要将这段代码加到main.c文件中去就能够了。咱们来编译一下:
编译以后,咱们发现,编译经过了。问题被完美的解决了。源码