Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解决already defined in .obj 的问题(定义/声明的区别)

解决already defined in .obj 的问题(定义/声明的区别)

作者头像
饶文津
发布于 2020-06-02 07:34:03
发布于 2020-06-02 07:34:03
1.5K00
代码可运行
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏
运行总次数:0
代码可运行

首先需要搞清楚什么是定义(definition ),什么是声明(declaration)。

一、函数

函数的声明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int myfunc(int a,int b);
定义:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int myfunc(int a,int b){

  return a+b;

}

.h中虽然可以声明然后定义函数,但是这样这.h就只能被#include一次,否则就会出现重定义错误:

Error LNK2005 _myfunc already defined in xxx.obj 

所以尽量不要再.h中定义函数。

二、变量

变量的声明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extern int a;

如果声明包含初始化表达式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。所以extern声明时不要初始化。

定义:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a;//a是一个整型外部变量

外部变量定义和外部变量声明的含义是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。

以下是良好的程序设计风格和惯例:

头文件(.h)中进行函数声明,源文件(.c)中进行函数的定义;

变量的声明统一放到头文件;

参考:http://www.cnblogs.com/magicsoar/p/3702365.html

http://c.biancheng.net/cpp/biancheng/view/143.html

http://my.oschina.net/xinxingegeya/blog/232758

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-06-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
⭐️ 关键字深度剖析 ⭐️第二章(多文件\数据类型&关键字extern/static)
第三章传送门:⭐️ 关键字深度剖析 ⭐️第三章(关键字sizeof\signed\unsigned&原反补\数据范围)
用户9645905
2022/11/30
2640
⭐️ 关键字深度剖析 ⭐️第二章(多文件\数据类型&关键字extern/static)
extern、定义和声明
    整体是函数的定义  ,函数的定义没有分号 而且要加上一对花括号 ,里边是函数的实现。
Twcat_tree
2022/11/30
1.3K0
extern、定义和声明
申明与定义的区别
C++编码过程中,我们经常谈及“定义”和“声明”,二者是编程过程中的基本概念。我们需要使用一个变量、类型(类、结构体、枚举、共用体)或者函数时,我们需要提前定义和申明。定义和申明的过程,就像我们向图书馆借阅书籍一般,需要先完成书籍的印刷,即创造出书籍,这是一个定义的过程,有了书籍,我们需要到图书馆完成借阅的登记手续,这是申明的过程。完成了申明,我们有了使用书籍的权限,就可以尽情的畅游在知识的海洋。如果说书籍是自己委托印刷厂印刷的,那么你无需向他人借阅,即无需声明,可以直接使用书籍。一本书籍只需要印刷一次,但是可以被多人多次借阅,也就是说定义只需要一次,但是申明可以有多次。这里的书籍指代的是“定义”和“声明”作用的对象,即变量、类型和函数。C/C++中,使用一个变量、类型或者函数必须先在使用前完成定义和申明。
恋喵大鲤鱼
2018/08/03
1.6K0
extern关键字
extern是c++引入的一个关键字,它可以应用于一个全局变量,函数或模板声明,说明该符号具有外部链接(external linkage)属性。也就是说,这个符号在别处定义。一般而言,C++全局变量的作用范围仅限于当前的文件,但同时C++也支持分离式编译,允许将程序分割为若干个文件被独立编译。于是就需要在文件间共享数据,这里extern就发挥了作用。
司空
2022/09/08
2.7K0
【C语言】C语言的变量和声明系统性讲解
在C语言中,**声明(Declaration)和定义(Definition)**是两个重要的基础概念,它们都涉及到变量、函数、结构体等的使用,但功能和作用存在明显区别:
LuckiBit
2024/12/11
2280
【C语言】C语言的变量和声明系统性讲解
值得一看:老外的嵌入式编程规范
作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令人沮丧的。这是不尊重人的,就像某人穿着泥泞的鞋子走进一间一尘不染的房子。
AI 电堂
2021/07/02
1.3K0
【深入浅出C#】章节 2:数据类型和变量:变量和常量的声明和初始化
变量在程序中扮演着重要的角色。它们用于存储和操作数据,为程序提供了灵活性和可扩展性。通过变量,我们可以方便地存储和访问不同类型的数据,如整数、浮点数、字符串等。变量还允许数据在程序的不同部分之间进行传递和共享,实现数据的交流和共享。同时,变量也用于对数据进行各种操作和计算,如算术运算、逻辑判断等,实现对数据的处理和转换。此外,变量还可以用于跟踪程序的状态和条件,根据不同的条件执行不同的操作或决策,实现程序的流程控制和逻辑控制。变量的可变性和灵活性使得程序的行为可以随着变量的值的改变而调整,满足不同的需求和条件。合理地管理变量可以提高程序的内存利用率,避免内存泄漏和资源浪费。因此,了解变量在程序中的作用和重要性对于设计和编写高质量、高效率的程序至关重要。
喵叔
2023/07/09
7420
C++面试高频考点:inline的深层理解与实战应用
您好,我是昊天,国内某头部音频公司的C++主程,多年的音视频开发经验,熟悉Qt、FFmpeg、OpenGL。
程序员的园
2025/04/10
1280
C++面试高频考点:inline的深层理解与实战应用
C语言深入理解extern用法 | 变量声明 | static
我们一般把所有的全局变量和全局函数的实现都放在一个*.cpp文件里面,然后用一个同名的*.h文件包含所有的函数和变量的声明。如:
CtrlX
2022/11/22
1.9K0
万字长文带你掌握C++11中auto和decltype的用法和区别
在 C++11 之前的版本(C++98 和 C++ 03)中,定义变量或者声明变量之前都必须指明它的类型,比如 int、char 等;但是在一些比较灵活的语言中,比如 C#、JavaScript、PHP、Python 等,程序员在定义变量时可以不指明具体的类型,而是让编译器(或者解释器)自己去推导,这就让代码的编写更加方便。
C语言与CPP编程
2024/04/26
7230
万字长文带你掌握C++11中auto和decltype的用法和区别
命名空间重定义问题
命名空间只不过是为了不让名字重复,而在两个cpp里面都调用了头文件,相当于这些变量被定义了两次,就类似于你是这样写的
无敌清风蓝
2024/11/12
1240
C++学习总结1——几个基本概念
最近我在做毕设。写程序的时候,总是被C++里面的指针搞得头昏脑胀。刚开始的时候还有些浮躁,不想静下心来仔细看看指针使用的细节。过了几天发现只在Visual Studio里面调试怎么也搞不定,只好硬着头皮,重新学习指针的用法。在看书和看别人写的博客后,感觉学到了许多新的东西,不光是关于指针,还有其他一些以前我不太清楚的内容。这些知识如果不常用或不记录下来的话,肯定会忘掉的,所以我就把它们都写下来,避免以后犯同样的错误。
王云峰
2019/12/25
5600
C++学习总结1——几个基本概念
[Modern CPP]内联变量——保证变量唯一性的利器
在 C++ 中,一个定义了全局变量的头文件被多个源文件包含时,每个源文件都会创建该全局变量的一个实例,这可能导致链接时出现重定义错误,代码示例如下。
程序员的园
2024/07/18
1350
[Modern CPP]内联变量——保证变量唯一性的利器
C++ 变量类型
变量其实只不过是程序可操作的存储区的名称。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
iOS程序应用
2023/05/19
3500
【编程基础】extern "C"的用法解析
1.引言   C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。 2.从标准头文件说起 某企业曾经给出如下的一道面试题: 为什么标准头文件都有类似以下的结构? #if
程序员互动联盟
2018/03/13
1K0
声明和定义的区别(深入理解)
问题 声明和定义区别 definition declared 微信排版支持makdown语法不友好 可以查看原文链接 先看一下 例子1 编译有没有问题? class B{private: A* m_pData;}; 编译很明显出现错误::没有 声明 error: ‘A’ has not been declared error: ‘A’ does not name a type 例子2 编译有没有问题 class A;class B{private: A* m_pData;}; 编译没
早起的鸟儿有虫吃
2018/04/13
1.4K0
深入理解extern使用方法
我们一般把全部的全局变量和全局函数的实现都放在一个*.cpp文件中面,然后用一个同名的*.h文件包括全部的函数和变量的声明。如:
全栈程序员站长
2022/07/07
4970
[C语言] 常量与变量
说明:系统会在字符串尾部添加一个字符串作为结束字符"\0",那么如图所示的长度实际上是6的原因! 
謓泽
2022/12/12
7690
[C语言] 常量与变量
lnk2001 lnk1120_lnk1120
学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
全栈程序员站长
2022/11/08
1.1K0
C++编译与链接(0)-.h与.cpp中的定义与声明
C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东西可在头文件中定义,声明,哪些东西又必须
magicsoar
2018/02/06
3.7K0
C++编译与链接(0)-.h与.cpp中的定义与声明
相关推荐
⭐️ 关键字深度剖析 ⭐️第二章(多文件\数据类型&关键字extern/static)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验