问题: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函数会重名,所以报错。