error LNK2005: "void __cdecl fun(void)" (?fun@@YAXXZ) 已经在 file.obj 中定义----错误的原因分析

问题:error LNK2005: "void __cdecl fun(void)" (?fun@@YAXXZ) 已经在 file.obj 中定义

遇到问题:

file文件是cpp文件的时候,编译报错(error LNK2005: "void __cdecl fun(void)" (?fun@@YAXXZ) 已经在 file.obj 中定义;fatal error LNK1169: 找到一个或多个多重定义的符号)

file文件是c文件的时候,编译成功。

原因:

我是用的是编译工具是Visual Studio2017,此编译器认为.c文件是C语言文件,.cpp文件是C++语言文件。

file文件是cpp文件的时候报错原因:因为main.cpp文件包含了file.cpp文件,所以fun函数在file.cpp文件中编译了一次,又在main.cpp文件中编译了一次。在第二次编译时,因为已经存在同名函数,所以报错。

file文件是c文件的时候不报错的原因:c文件编译函数不会对函数进行name mandling(名称修饰),cpp文件在编译函数会对函数进行name mandling(C++支持函数重载)。此时fun函数同样会编译两次,但是不会有重命名的情况。

拓展:当为下面这种情况时,file文件是c文件仍会报错,原因是因为f.cpp文件和main.cpp文件同时包含了file.c文件,此时fun函数会编译三次,在f.cpp和mian.cpp文件中编译的fun函数会重名,所以报错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值