C/C++混合编程之extern “C”的使用示例
前言 本文主要给大家介绍了关于C/C++混合编程extern “C”使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 首先要明白: C++号称是C语言的超集,也确实,从语言的基本语法上,C++是包含所有C语言的语法的,而且C++为了兼容C,连C语言的标准库也被纳入到C++的标准库中,比如在C++中我们仍然可以使用 但是,C++和C语言的编译器在有些地方还是有差别的。比如,C++是支持面向对象的特性(尽管C++被称为不彻底的面向对象语言),面向对象就要支持函数重载,而函数重载的实现和C++编译器是分不开的。 比如有: int max(int a,int b); 和 double max(double a,double b); 这两个函数。 这两个函数同时存在,在C语言中是不可以的,因为C语言不支持重载,但是在C++中完全没有问题,因为C++是支持重载的。 那么为什么会这样呢? 这要从编译器的角度来看: C编译器将 C编译器将 但是C++编译器则不同 C++编译器将 _max_int_int 而另一个则为 这也是C++支持函数重载的根本原因。不过,这也从另一面说明了:函数重载其实不是多态,顶多算是编译时多态。 在C++和C混合编程时: 在C++和C语言混合编程时,前面已经说过,C++的语法是完全包含C语言的语法的,所以不用担心语法上出现什么问题。出现问题的主要原因在编译和链接时。 思考这样一件事情: 我们在Linux下编程的时候,经常会用到内核的库,我们知道Linux内核使用C语言写的。如果这些库采用了C语言的编译器进行编译,而我们的程序是用C++开发的,要用C++进行编译,那么会出现什么问题? 比如: 我们有个.c文件p.c,内容如下: #include <stdio.h> void print(int a,int b) { printf("这里调用的是C语言的函数:%d,%dn",a,b); } 我们用 然后我们又p.h文件,里面是print函数的原型声明,如下: void print(int a,int b); 我们又有main.cpp文件,内容如下 #include <iostream> using namespace std; #include "p.h" int main() { cout<<"现在调用C语言函数n"; print(3,4); return 0; } 这次我们用g++ -c进行编译,生成main.o文件 然后我们用g++链接两个.o文件,这时我们会发现,报错: 这时为什么呢? 因为: p.c我们使用的是C语言的编译器gcc进行编译的,其中的函数print编译之后,在符号表中的名字为 _print 而我们链接的时候采用的是g++进行链接,也就是C++链接方式,程序在运行到调用print函数的代码时,会在符号表中寻找_print_int_int(是按照C++的链接方法来寻找的,所以是找_print_int_int而不是找_print)的名字,发现找不到,所以会t提示“未定义的引用” 此时如果我们在对print的声明中加入 extern “C” ,这个时候,g++编译器就会按照C语言的链接方式进行寻找,也就是在符号表中寻找_print,这个时候是可以找到的,是不会报错的。比如我们修改p.h为: extern "C" void print(int a,int b); 这是结果为: 所以extern “C” 用到函数声明之前,它的作用就是告诉编译器,对于该函数的链接要采用C语言编译器的链接方式,也就是告诉编译器找_fun,而不是_fun_int_int。 如果有多个函数声明都需要在前面加extern “C”,那可以用extern “C”{}的形式。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |