【实验】使用gcc、g++,编译带和不带extern C的C/C++混合代码,并查看编译、链接结果

材料

1. a.cpp

extern "C"{
#include "b.h"
}

int main(){
	int c = Foo(2, 4);
	return 0;
}

2. b.h

#ifndef _B_H
#define _B_H

int Foo(int a, int b);

#endif

3. b.c

#include "b.h"

int Foo(int a, int b){
	static int c = 1;
	return (a > b) ? a : b;
}

记录

1. 测试a.cpp中不带extern "C"的情况

1.1 使用gcc编译b.c,成为b.s汇编文件

命令:gcc -S .\b.c
结果:可以看到这里是_Foo。
在这里插入图片描述
图1

1.2. 使用g++编译不带extern "C"的a.cpp,成为a.s汇编文件

命令:gcc -S .\a.cpp
结果:可以看到这里调用的是_Z3Fooii。但是b.c的Foo函数编译的结果和此处调用的函数不一样,所以在链接时会出错。
在这里插入图片描述
图2

1.3. 使用gcc编译、链接不带extern "C"的a.cpp和b.c

命令:gcc .\a.cpp .\b.c -lstdc++ 和 gcc .\a.cpp .\b.c
结果:
使用gcc编译的结果是找不到Foo函数。
在这里插入图片描述
图3
注意:
但使用g++是可以编译成功的。
在这里插入图片描述
图4

这是因为,**c文件同cpp文件一样,也是可以按照C++的标准进行编译的。**我们再来使用C++标准编译C文件。
命令:g++ -S .\b.c -nostartfiles
结果:对比图1、图2可以知道,c文件和cpp文件编译的函数头是同一个格式,因此调用时就不会出错。
在这里插入图片描述
图5

2. 测试a.cpp中带extern "C"的情况

2.1. 使用gcc编译带extern "C"的a.cpp,成为a.s汇编文件

命令:gcc -S .\a.cpp
结果:对比图2,可以看到不同。此时a.cpp中调用的是c中编译得到的_Foo
在这里插入图片描述
图6

2.2. 使用gcc编译、链接带extern "C"的a.cpp和b.c

命令:gcc .\a.cpp .\b.c -lstdc++ 和 gcc .\a.cpp .\b.c
结果:编译、链接成功。
在这里插入图片描述
图7


结论

  • cpp文件使用c文件时,gcc编译器编译时需要让cpp文件指定编译的c文件按照C的标准编译,否则会因为编译的结果不匹配而链接错误。而g++编译器默认c文件按照C++标准编译。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值