• "fatal error LNK1169: 找到一个或多个多重定义的符号" 解决方案


    本人在测试刚刚安装的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中, 这样运行后没有报错. 另外, 由于是重定义发生了错误, 所以如果我们用内联函数, 这样在执行时是嵌入代码块, 这样也就不会再出现函数的重定义的问题.

    同样的, 除了函数的定义不能在头文件里实现, 变量的定义以及类的方法的定义同样不能放在头文件里, 这样出现重定义报错的情况.

  • 相关阅读:
    jboss hello world
    jboss 7 启动问题
    jboss [how to access the admin console]
    tomee 消息持久化
    Python、C和Java对比
    编程语言产生时间表
    从关系型数据库到非关系型数据库
    约束和异常处理
    类与类之间的关系
    类的成员
  • 原文地址:https://www.cnblogs.com/runsdeep/p/11157805.html
Copyright © 2020-2023  润新知