本人在测试刚刚安装的vs2017时运行出了问题, 错误信息为 "fatal error LNK1169: 找到一个或多个多重定义的符号", 代码如下:
//Myfile.h #include<iostream> #include<iomanip> #include<cmath> int fac(int n) { int t = 1; for (int i = 1; i <= n; i++) { t *= i; } return t; } float max(float x1, float x2) { return (x1 > x2 ? x1 : x2); } void menu() { printf("hello world "); } //test.cpp #include "Myfile.h" using namespace std; int main() { cout << fac(5) << endl; cout << max(3, 9) << endl; menu(); return 0; }
仔细思考了下报错原因, 在头文件包含到test.cpp时, 而实际上Myfile.h中包含了构造函数的实现,于是test.cpp生成目标文件的时候,包含了构造函数的实现。而test.cpp也包含了test.h,同样编译生成目标文件的时候,也会包含构造函数的实现。这样二者在链接阶段就会发现有两个一模一样的函数,出现了重定义的问题. 解决方法如下:
将函数的声明放在头文件Myfile.h里, 函数的定义则放在test.cpp中, 这样运行后没有报错. 另外, 由于是重定义发生了错误, 所以如果我们用内联函数, 这样在执行时是嵌入代码块, 这样也就不会再出现函数的重定义的问题.
同样的, 除了函数的定义不能在头文件里实现, 变量的定义以及类的方法的定义同样不能放在头文件里, 这样出现重定义报错的情况.