extern "C"两个实例,帮你解决小问题。

1 篇文章 0 订阅

网上有很多介绍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中进行测试,如有不妥,欢迎指正。


 




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值