C++和C的相互调用

在实际的工程中,C++和C的相互调用时不可避免的。但是有时候用C语言的编译器编译成的软件包,在C++的程序中调用会出现错误。
先看一下一个例子:
add.c

#include "add.h"
int add(int a, int b)
{
    return a + b;
}

add.h

int add(int a, int b);

将这两个文件用C语言编译器编译成目标文件:
gcc add.c -o add.o
下面是一个C++主程序
main.cpp
add.h

#include <stdio.h>
#include "add.h"

int main()
{
    int c = add(1, 2);
    
    printf("c = %d\n", c);
    
    return 0;
}

用C++编译器编译:
g++ main.cpp add.o
用C++编译器编译的时候,会提示错误,说没哟add()这个函数。也就是说用C语言编译的add()函数无法在C++编译器中无法得到调用。
在C++中:
C++编译器能够兼容C语言编译方式
C++编译器会优先使用C++的编译方式
extern关键字能够强制让C++编译器按C语言的编译器编译程序

例如将上面的主程序修改一下:

#include <stdio.h>
extern "C"		// 强制用C语言编译器编译
{
#include "add.h"
}

int main()
{
    int c = add(1, 2);
    
    printf("c = %d\n", c);
    
    return 0;
}

当编译运行现在的代码就能得到运行。

在C语言中,是不支持extern “C” {} 这种方式的,但是我们上面那个程序如果用C语言编译器来编译会出错,用C++编译器则不会出错,这个时候我们可以用C++编译器内置的标准宏定义**__cplusplus**,来让我们的程序在C++和C语言的编译器编译运行都不会出错。我们对上面的程序做一下修改:

#include <stdio.h>
#ifdef __cplusplus	//如果是C++编译器,则使用extern "C",如果是C语言编译器,则直接#include "add.h"

extern "C" {
#endif

#include "add.h"

#ifdef __cplusplus
}
#endif
int main()
{
    int c = add(1, 2);
    
    printf("c = %d\n", c);
    
    return 0;
}

用上面的扩展宏定义之后就能同时在C++和C语言编译器编译运行了。

注意事项

1、C++编译器不能以C的方式编译重载函数
2、编译方式决定函数名被编译之后的目标名
C++编译器将函数名和参数列表编译成函数名
c编译器只将函数名作为目标名进行编译

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值