网上有很多介绍extern "C"的文章,都很不错,可是我在对其中c文件引用cpp函数,cpp文件引用c函数,又涉及到重载的时候,还是有点小迷糊,只好自己弄几个实例,一目了然。
这里需要注意:
1、extern "C" 是c++中的东西,c语言中是没有这个说法的,所以在c语言main函数中中用到这个会报错的
首先看一个c++引用c文件的例子:
原因不做多介绍,直接上例子:
c头文件:
//cfoo.h
//因为遵从接口与实现分离的思想,此处函
//数声明时候可加可不加extern关键词
//extern int foo(int, int)
//均可
int foo (int, int)
c实现文件:
//cfoo.c
#include "cfoo.h"
int foo (int a,int b)
{
return a + b;
}
c++主文件进行调用
//cppmain.cpp
//因为连接的原因直接按照下面的写法会报错
//#include "cfoo.h"
//前面说过,c++文件中可以使用extern "C",告诉编译器,请按照c的方式进行编译连接
extern "C"
{
#include "cfoo.h"
}
int main()
{
int x(1),y(1);
//下面代码返回值为2,符合我们的期望
int z = foo(x,y);
return 0;
}
下面进入主题:
如果我在cppmain中又重新定义一个int foo (int, int),会是个什么情况呢?编译器会通知你,foo这个函数进行了重定义
因为c++中可以进行重载,所以当我们在cppmain中重新定义一个double foo (double,double)时,编译器不会报错,因为进行了重载的缘故。编译连接一切都按照实参最优匹配的原则进行,不再赘述。
那么我们如何在c文件中使用cpp函数呢?
请看下面的例子:
//cppfoo.h
extern "C"
{
int foo (int,int);
//暂时保留这个注释,等程序运行完毕之后看看有啥好玩的发生
//double foo (double,double);
};
//实现文件cppfoo.cpp
include "cppfoo.h"
int foo(int a,int b)
{
return a + b;
}
//cmain.c
#include "stdio.h"
//如果按照下面的写法会报错,因为c中没有extern "C"这种语句
//#include "cppfoo.h"
//所以不引用头文件,而是直接声明,让编译器自己去找去
extern int foo(int ,int);
int main()
{
int x = 1,y = 1;
int z;
z = foo(x,y);
printf("%d\n",z);
return 0;
}
好了,可以完美运行了,问题返回来,如果我们把//cppfoo.h中的注释去掉,看看有什么情况?编译器会提醒foo函数进行了重复定义吧?对了,因为c不支持重载的,所以即使你对double foo进行了定义,并且定义了double变量进行调用,也是不对滴。所以,c++的重载在c中没有用武之地了。
好了,问题说完了,以上程序均在vs2010中进行测试,如有不妥,欢迎指正。