VS报错:error:LNK2005 _main 已经在 *.obj 中定义

应该是重定义了,但是又解决不了,看似又没有重定义啊,就在一个文件定义了啊?怎么会出现这种情况呢?关键是,编译报错,程序运行不了了。

这里提一下我的前期操作,是因为将一个头文件和源文件合并为一个头文件了,然后在主函数文件嵌入这个头文件。

一个解决办法:

vs2017错误:error:LNK2005 _main 已经在 *.obj 中定义 - 简书 (jianshu.com)

确实编译不报错,但是会警告可能会不执行。

......

试运行程序,没有问题。

应该是解决了。但总是不太放心,没有直接解决问题啊,到底哪里出问题了呢?

另外一些分析:

error:LNK2005 _main 已经在 *.obj 中定义_cmakecudacompilerld.cu.obj main已经在main.cpp.obj定义-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/yan_less/article/details/73149578

感觉很可能是这里面的变量没有用extern重新声明下。但是尝试在需要使用的文件将这些变量再extern一下,结果还是报错。看来不是这里的问题。

多次尝试,才发现问题。先说背景原因:

C编译,嵌入头文件,即include语句,意思就是拷贝对应头文件到嵌入的地方,如果头文件中对变量进行定义并初始化了。那么在嵌入头文件的文件,这些变量又会初始化,C不允许重复对一个变量定义并初始化,就会报这种重复定义的错误。

分析下我的程序结构:

看前期操作,是将一个源文件和头文件合并,写成一个头文件。然后在主程序文件include这个头文件。理论上,头文件定义的变量在主文件是可以用的,不会出现重定义这种问题,因为主文件也没再定义。但实际上,头文件中变量,只能声明,不能定义。如果定义了,那么在嵌入的主文件,编译时是将头文件定义的代码又拷贝到主文件,则会形成重定义。

所以,头文件最好是只声明。C中,变量的重复声明是没有任何问题的!

所以是这种合并操作导致的。要直接解决问题,则还是要将源文件和头文件分开写,且头文件不能定义,只能声明。

实际上,多年以来一直有个问题困扰我很久,总弄不明白,就是一般一个头文件对应一个源文件,但是,一些数据类型、宏定义等,在头文件中定义,在源文件中使用,同时,在其他文件也要使用,那么源文件必须嵌入这个头文件,其他文件也需要嵌入这个头文件。然后,一些变量,在源文件中定义,别的源文件需要使用,则,就需要在头文件中声明。所以,源文件和头文件是相互引用的关系?是不是应该定义两个头文件,一个头文件只定义源文件要用的数据类型、宏等,另一个头文件,提供源文件中其他文件需要使用的变量和函数的声明?其他文件在嵌入时,只需要嵌入后一个头文件?这样就解决了源文件和头文件相互引用的问题?

但是,如果其他文件还需要用第一个头文件定义的数据类型和宏呢?因为源文件中定义的一些其他文件需要使用的变量可能是基于这些数据类型和宏,那不是还要再嵌入第一个头文件?那不是很麻烦么???

现在就很好解决了。其实,只需要在头文件中变量声明时前面加extern关键字就可以了。这些变量,是在源文件中定义的,在头文件声明,其他源文件只需要嵌入头文件,即可使用。源文件虽然嵌入头文件,再次碰到这些变量声明,但是因为用了extern,可以忽略这些声明,而只使用本文件内定义,使用即可。

而头文件中声明(定义)的数据类型、宏,可以在源文件用,也可以在其他嵌入这个头文件的文件使用。其实,这些数据类型和宏,完全可以在源文件定义,然后在头文件再声明,和变量、函数是一样的处理。只不过,一般就不需要了,只需要在头文件定义,源文件引用即可。

完美!其实是应该开始学C就该搞清楚的问题,我现在才搞清楚,哎,就这样吧,因为可能很多人都一样,不会去注意这个问题,国内没有讲述清楚底层、内幕的风气,希望能帮到一些人吧。

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

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

相关文章

NULL是什么?

NULL是一个编程术语,通常用于表示一个空值或无效值。在很多编程语言中,NULL用于表示一个变量或指针不引用任何有效的对象或内存位置。 NULL可以看作是一个特殊的值,表示缺少有效的数据或引用。当一个变量被赋予NULL值时,它表示该变…

【面试宝典】图解ARP协议、TCP协议、UDP协议

一、ARP协议 二、TCP协议 三、UDP协议 四、TCP和UDP的区别

如何有效使用360评估

导语:360度评估是绩效考核方法之一,被评估者不仅可以从自己、上司、部属、甚至顾客处获得多种角度的反馈,也可从这些不同的反馈清楚地认识到自己的不足、长处与发展需求。但360度评估也有其适用的范围和条件,华为总裁任正非给出了…

impala元数据自动刷新

一.操作步骤 进入CM界面 > Hive > 配置 > 搜索 启用数据库中的存储通知(英文界面搜索:Enable Stored Notifications in Database),并且勾选,注意一定要勾选,配置后面的配置不生效。数据库通知的保留时间默认为2天&#…

Nacos下载与安装【windows】

🥚今日鸡汤🥚 我不知将去何方,但我已经在路上。 ——宫崎骏《千与千寻》 目录 🥞1.Nacosdi地址 🌭2.GitHub下载 🍿3.目录结构 🥓4.启动nacos 🧂5.客户端登陆 &#x1f9c8…

GitHub 一周热点汇总第5期(2024/01/07-01/13)

GitHub一周热点汇总第5期 (2024/01/07-01/13),梳理每周热门的GitHub项目,这一周的热门项目都普遍比较年轻,有几个更是刚刚发布就火热起来了,一起来看看都有哪些项目吧。 #1 llm-course 项目名称:llm-course - 大语言…

华为路由器OSPF动态链路路由协议配置

R1配置 interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.252 interface LoopBack0ip address 1.1.1.1 255.255.255.255 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.1.12.0 0.0.0.3 R2配置 interface GigabitEthernet0/0/0i…

特征工程-特征处理(一)

特征处理-(离散型特征处理) 完成特征理解和特征清洗之后,我们要进行特征工程中最为重要和复杂的一步了——特征处理 离散型特征处理 离散型特征通常为非连续值或以字符串形式存在的特征,离散型特征通常来讲是不能直接喂入模型中…

四川云汇优想教育咨询有限公司引领电商未来

四川云汇优想教育咨询有限公司,一家在电商服务领域崭露头角的领军企业,致力于为广大客户提供最优质、最全面的电商服务。作为业界翘楚,云汇优想凭借其卓越的服务品质和强大的技术实力,在激烈的市场竞争中独树一帜,赢得…

将WAP网站封装成App体验的全新策略

一、传统的App封装方式 传统的App封装技术通常依赖于WebView组件,将WAP内容嵌入到一个原生App框架中。这种方法虽然可以快速实现WAP到App的转换,但存在着明显的缺陷:首先,WebView的性能和用户体验都无法与原生组件相提并论&#x…

金蝶云星空与金蝶云星空对接集成逐个单据查询连通员工新增(3009-销售退货清理卡片)

金蝶云星空与金蝶云星空对接集成逐个单据查询连通员工新增(3009-销售退货清理卡片) 来源系统:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人…

【TC3xx芯片】TC3xx芯片电源管理系统PMS详解

目录 前言 正文 1.供电模式选择(Supply Mode Selection) 1.1 供电域 1.2 供电模式 1.3 供电阈值 1.4 供电上升和下降行为Supply Ramp-up and Ramp-down Behavior 1.5 EVRC产生供电 2. 电源监控 2.1 电源监控原理 2.2 Primary低电压监控 2.3 …

C++六大组件之一:仿函数

场景一&#xff1a; 与其过多叙述定义&#xff0c;不如在下面一个场景中来理解仿函数&#xff1a; #include<iostream> using namespace std; template<class T> void bubbles_sort(T* arr,int size) //冒泡排序 {for (int i 0; i < size - 1; i){for (int j…

Android系统启动-Zygote详解(Android 14)

一、什么是Zygote 在上一篇文章Android系统启动-init进程详解&#xff08;Android 14&#xff09;中&#xff0c;分析了init进程&#xff0c;在init进程启动的第二阶段会解析init.*.rc文件&#xff0c;启动多个进程&#xff0c;其中包括Zygote。 Zygote又叫孵化器&#xff0c…

SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!

SSM整合 1.1 流程分析1.2 整合配置步骤1&#xff1a;创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步骤7:创建jdbc.properties步骤8:创建SpringMVC配置类步骤9:创建Web项目入口配…

部署 LVS-DR 群集

本章内容&#xff1a; -了解LVS-DR群集的工作原理 -会构建LVS-DR负载均衡群集 2.1 LVS-DR 集群 LVS-DR &#xff08; Linux Virtual Server Director Server &#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 2.1.1 &#xff0e; LVS-DR 工作原理 …

Idea Community社区版,新建module不使用maven archetype

最近使用 idea 社区版&#xff0c;新建module时始终要选择maven archetype&#xff0c;如下图&#xff1a; 后来发现需要手动切换左侧的菜单栏&#xff0c;在"New Module"上点击一下&#xff0c;就可以了&#xff1a; 记录一下&#xff0c;方便以后查阅

模板设计模式-实例

在软件开发中&#xff0c;有时也会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff08;类似“请客”&#xff09;&#xff0c;其 中有些步骤是固定的&#xff08;类似“点单”和“买单”&#xff09;&#xff0c;而有些步骤并不固定&#xff0c;存在可变性&…

性能测试分析案例-使用动态追踪定位性能瓶颈

所谓动态追踪&#xff0c;就是在系统或者应用程序正常运行的时候&#xff0c;通过内核中提供的探针&#xff0c;来动态追踪它们的行为&#xff0c;从而辅助排查出性能问题的瓶颈。 使用动态追踪&#xff0c;可以在不修改代码、不重启服务的情况下&#xff0c;动态了解应用程序或…

点的旋转变换

情形一&#xff08;active or alibi transformation主动变换&#xff09; 在坐标系 x − y x-y x−y中&#xff0c;点 p 1 p_1 p1​逆时针旋转 α \alpha α后到达点 p 2 p_2 p2​。 p 1 p_1 p1​在 x − y x-y x−y中的表示与 p 2 p_2 p2​在 x ′ − y ′ x-y x′−y′中的表…