c++基础知识8——c++引用c代码

背景: c++需要兼容c代码,当它调用c编译器生成的目标文件时会报错。如,

举例:
前提条件说明——已经使用gcc生成了一个c_xxx.o的目标文件。c++文件内容如下:

//c++文件yyy.cpp
#include "c_xxx.h"	//这里包含了c代码的头文件
int main(void)
{
	c_func();	//这里调用了c代码里的函数
}

然后使用g++ yyy.cpp c_xxx.o进行编译,这时候会报错。

解决办法:
使用extern关键字,让c代码使用gcc编译,如下:

//c++文件
extern "C"
{
#include "c_xxx.h"	//这里包含了c代码的头文件
}

int main(void)
{
	c_func();	//这里调用了c代码里的函数
}

拓展问题: 如果反过来,直接将c++代码复制到c文件中用gcc编译就会报错,因为c编译器不支持extern "C"语法。那么有什么办法可以让这段代码同时支持c和c++呢?
解决办法:
c++编译器内置标准宏定义__cplusplus,所以当使用g++编译时该宏定义会被定义,而gcc则没有。
利用这一点,可以使用下面这个格式实现兼容。

#ifdef __cplusplus	
extern "C"{
#endif

#include "c_xxx.h"	// <= 这里为c代码

#ifdef __cplusplus
}
#endif

注意:extern "C"中的代码块不能出现重载函数。因为对于重载函数,c++编译方式将函数名和参数列表编译成目标名,本质上最终生成了不同的函数名;而c语言则是只将函数名作为目标名进行编译,也就是生成同名的函数,会导致冲突。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值