VS2022编译错误:链接器工具错误 LNK2005

news/2024/5/1 2:15:31/文章来源:https://www.cnblogs.com/YiMo9929/p/16750483.html

产生原因

自己在学习namespace时,参照C++ plus一书写了基本相同的代码,分别定义了h文件和两个CPP文件,其中一个CPP用来定义变量,一个CPP用来跑main(void)。文件代码如下:

head.h文件

#pragma once
#include<string>
#include <iostream>namespace pers
{struct Person;inline void getPerson(struct Person& rp);inline  void showPerson(struct Person& rp);
}namespace debts
{struct Debt;static void getDebt(struct Debt& rd);static void showDebt(struct Debt& rd);static double sumDebts(const struct Debt ar[], int n);
}

source.cpp

#include "head.h"namespace pers
{using namespace std;struct Person{std::string fname;std::string lname;};//拿取名字void getPerson(struct Person& rp){cout << "Enter the first name: ";cin >> rp.fname;cout << "Enter the last name: ";cin >> rp.lname;}//展示名字void showPerson(struct Person& rp){cout << rp.fname << rp.lname << endl;}
}namespace debts
{using namespace pers;struct Debt{Person name;double amount;};void getDebt(struct Debt &rd){getPerson(rd.name);//debt类型cout << "Enter debt: " << endl;cin >> rd.amount;//存放欠款}void showDebt(struct Debt& rd){showPerson(rd.name);cout << rd.amount << endl;}double sumDebts(const struct Debt ar[], int n){double total=0.0;for (int i = 0; i < n; i++)total+= ar[i].amount;return total;}
}

main.cpp

#include "source.cpp"
#include "head.h"int main(void)
{using debts::Debt;using debts::showDebt;struct Debt user = {{"zhang","wei"},123};showDebt(user);return 0;
}

编译错误现象

解决过程

1、尝试将source.cpp文件改为.h文件,编译错误
2、尝试将main.cpp文件中的.h文件包含去除,避免二次包含,编译错误
3、迫不得已按照官方的处理办法进行了static,但个人感觉inline内联更好一点,至少占用的栈资源能少一点。链接器工具错误和警告 (LNKxxxx)

结论

结合网络相关文章,我认采纳的错误原因函数产生了二义性。当然,网上各种文章对此错误的原因分析分别为:

  • #program once只能识别一次,第二次包含再遇到#program once就会判定错误(可能,但是个人仁伟既然有program once用法,vs怎末可能第二次识别的时候错误了呢)
  • .h文件不能多次包含(实际因为prgrame once不会有这种情况)
  • .mian不能多处定义(不会有这种非常低级的错误)
  • 变量或函数多次定义(可能)
  • 强符号不能多次定义(又多了解了一点)

当然,上面的说法可能大家实际需要的情况不一样,有道理但是并不适用于我的场景,我感觉比较合理的说法是:函数多次定义,应为函数首先在Scource文件中进行了定义,在h文件中进行了声明,但是在执行main时又包括了一次source,导致函数产生二义性,根本原因是函数的特征符相同,也就是编译器首先进行函数重载,但是发现特征符相同,所以报二次定义。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_17854.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于在网页中实现数据库数据的遍历

基于套用了网站模板,然后连接了数据库 具体实现如下:1、定义一个实体类Uesr package org.example;public class User {private String name;private String id;private String teacher;private String whe;public void setName(String name){this.name=name;}public String g…

【ES6丨前端进阶基础 】ES6的关键字,新特性以及解构赋值

&#x1f482; 个人主页&#xff1a;Aic山鱼 个人社区&#xff1a;山鱼社区 &#x1f4ac; 如果文章对你有所帮助请点个&#x1f44d;吧!欢迎关注、点赞、收藏(一键三连)和订阅专目录 前言 什么是ecmascrpit 一&#xff0c;let关键字的特点 1.不能重复声明变量 2.块级作用…

【持久层框架】- SpringData - JPA

SpringData - JPA &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 一个有梦有戏的人 怒放吧德德 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;…

图解mysql(六)——内存篇

6 揭开Buffer Pool的面纱 6.1 为什么要有Buffer Pool&#xff1f; 虽然说 MySQL 的数据是存储在磁盘里的&#xff0c;但是也不能每次都从磁盘里面读取数据&#xff0c;这样性能是极差的。 要想提升查询性能&#xff0c;加个缓存就行了嘛。所以&#xff0c;当数据从磁盘中取出…

基于BootStrap的农业信息数据收集与管理平台设计

目 录 1 前言 1 1.1 研究背景 1 1.2 研究内容 1 1.3 研究意义 1 1.4 本论文工作和章节内容 2 2 系统环境与技术支持 3 2.1 系统环境 3 2.2 B/S架构 3 2.3 服务端技术 3 2.3.1 MVC模式 3 2.3.2 Spring框架 4 2.3.3 Hibernate框架 4 2.3.4 MySQL数据库 5 2.4 前端技术 5 2.4.1 Bo…

基于JavaWeb的企业出差费用报销管理系统设计与实现

目录 第一章 绪论 1 1.1 出差报销管理系统的开发背景 1 1.2设计目的与意义 1 第二章 系统需求分析 2 2.1 可行性分析 2 2.1.1 操作可行性 2 2.1.2 经济可行性 2 2.1.3 技术可行性 2 2.2方案的设计与比较 2 2.2.1 C/S设计结构和B/S设计结构比较 2 2.2.2 系统模式的设计 3 2.2.3系…

大二数据库实验-MySQL语句(Employee、Department、Salary)

实验所用到的的几张表&#xff1a; 显示Employee表中姓王的记录。 显示salary 表中InCome大于2000的数据。 显示salary 表中InCome在2500到3000之间的数据。 显示Employee表中在1968年下半年出生的数据。 分别显示三个表中总记录条数。 显示salary表中收入和支出总…

(附源码)计算机毕业设计ssm财务管理系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.2.1系统开发流程 财务管理系统开发时&#xff0c;首先进行需求分析&#xff0c;进而对系统进行总体的设计规划&#xff0c;设计系统功能模块&#xff0c;数据库的选择等&#xff0c;本系统的…

权限控制WAF绕过之木马混淆免杀

目录 前言&#xff1a; 绕过思路&#xff1a; &#xff08;一&#xff09;变量覆盖 &#xff08;二&#xff09;加密混杂 未加密前&#xff1a; 接口加密 加密后&#xff1a; WAF验证&#xff1a; &#xff08;三&#xff09;异或生成 0x01 原理&#xff1a; 0x02 适用…

线段树什么的最讨厌了

发现如果正着从一颗线段树搜到这一个区间,很难搜。所以考虑从一个区间搜出一颗线段树。 对于一个区间 \([l,r]\),他的父亲区间只可能是 \([2*l-r-2,r],[2*l-r-1,r],[l,2*r-l],[l,2*r-l-1]\) 四种情况。 发现无论往哪一种方向走,\(\frac{l}{r-l+1}\) 的值都会除以2.那么这么做…

建立对单片机/嵌入式启动、运行的整体认知

文章目录一、51单片机的启动过程二、STM32的完整启动流程分析1. 根据boot引脚决定三种启动模式2. 启动后bootloader做了什么&#xff1f;3. bootloader中对内存的搬移和初始化4. ISP、IAP、ICP三种烧录方式5. 参考资料从上电到启动&#xff0c;一文读懂STM32启动全流程1、直接上…

m基于FPGA的cordic算法实现,输出sin和cos波形(包括仿真录像)

目录 1.源码获取方式 2.算法描述 3.部分程序 4.部分仿真图预览 1.源码获取方式 使用版本matlab2022a 获取方式1&#xff1a; 点击下载链接&#xff08;解压密码C123456&#xff09;&#xff1a; m基于FPGA的cordic算法实现,输出sin和cos波形 获取方式2&#xff1a; 如…

程序员的数学课21 神经网络与深度学习:计算机是如何理解图像、文本和语音的?

在上一讲的最后&#xff0c;我们提到过“浅层模型”和“深层模型”。其实&#xff0c;人工智能的早期并没有“浅层模型”的概念&#xff0c;浅层模型是深度学习出现之后&#xff0c;与之对应而形成的概念。在浅层模型向深层模型转变的过程中&#xff0c;神经网络算法无疑是个催…

Vue2 生命周期

Vue 生命周期 概述在使用 Vue 时,我们需要执行一些 JS 代码。比如我们需要在页面中添加一个定时器来固定间隔更新时间。这时我们可能会想到直接在,Vue 实例外书写 JS 代码。这种方法能完成操作,但是 Vue 并不建议这样写。Vue 建议尽量在 Vue 实例中完成所有的操作。这时我们…

Hadoop3.X安装教程(Ubuntu)

前提:一台纯净的Ubuntu机器(虚拟机安装教程略) ctrl + alt + T 打开bash,全程使用bash指令进行,以hadoop 和 java 8为例 首先换源进入root账户 sudo su -升级软件列表 apt-get update安装vim apt install vim中途询问直接输入Y确认下载hadoop和java 创建/data mkdir /data…

半导体中的缺陷和位错能级

点缺陷&#xff1a; 在一定的温度下&#xff0c;组成晶体的格点原子在平衡位置附近做振动&#xff0c;这些振动就会有强有弱&#xff0c;这样会使得一部分原子可以获得足够的能量&#xff0c;而挣脱周围电子对它的束缚&#xff0c;挤入间隙位置&#xff0c;这样的结果就形成了…

211西北大学,计算机、软件学硕和专硕专业课都变难了!

西北大学位于陕西省西安市&#xff0c;是一所211大学。西北大学计算机学科评估B-&#xff0c;软件工程学科评估B&#xff0c;计算机实力在211大学中处于中上游水平&#xff0c;还算不错。西北大学前段时间公布了23考研的招生目录&#xff0c;我们来看一下&#xff1a;西北大学2…

Unity的UI框架

UI框架 UI框架的含义 含义&#xff1a;UI框架用于管理场景中所有的面板&#xff0c;负责控制面板之间的跳转 UI框架的意义 1、随着游戏系统的复杂化&#xff0c;UI控件越来越多&#xff0c;各个UI之间的直接通讯&#xff0c;已经UI与GameObject之间的关系会越来越复杂 2、代…

盘点一个Python自动化办公的实战案例

点击上方“Python共享之家”&#xff0c;进行关注回复“资源”即可获赠Python学习资料今日鸡汤岭猿同旦暮&#xff0c;江柳共风烟。大家好&#xff0c;我是皮皮。 一、前言前几天在Python钻石交流群【Hxy任我肥】问了一个Python自动化办公的问题&#xff0c;提问截图如下&am…

基于Vue+SSM+SpringCloudAlibaba的英雄管理系统

需求 前端技术&#xff1a;element-ui、vue后端技术&#xff1a;spring boot、spring cloud、mybatis plus、jwt项目要求&#xff1a; 前端&#xff1a;exam-war-fore-1217后端&#xff1a;exam-war-parent-1217端口要求&#xff1a; 注册中心&#xff1a;10086、10087 &#x…