zoukankan      html  css  js  c++  java
  • "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中, 这样运行后没有报错. 另外, 由于是重定义发生了错误, 所以如果我们用内联函数, 这样在执行时是嵌入代码块, 这样也就不会再出现函数的重定义的问题.

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

  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/runsdeep/p/11157805.html
Copyright © 2011-2022 走看看