鱼C论坛

 找回密码
 立即注册
查看: 1832|回复: 13

为什么不提示重复定义?

[复制链接]
发表于 2015-6-18 13:10:30 | 显示全部楼层 |阅读模式
5鱼币
两个 c 文件都包含了“a.h”这个头文件,为什么不提示 变量 a 重复定义?
360截图20150618130537920.jpg

最佳答案

查看完整内容

昨天撸多了 明显思路错误了 楼主 是这样的 在头文件中int a 相当于extern a 即在头文件中定义的变量 并没有被分配内存空间 仅仅做声明作用 而没有被实现(初始化) 想法 如果楼主 你在头文件中 进行 a = 3 一个赋值操作 那么此时就强制给a进行了实例化 马上报错 说.obj文件中出现多个重定义 因为此时的a已经被实例化了 每个.obj里各有一个 自然报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 13:10:31 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-6-19 11:48 编辑

昨天撸多了 明显思路错误了

楼主 是这样的 在头文件中int a 相当于extern a 即在头文件中定义的变量 并没有被分配内存空间
仅仅做声明作用  而没有被实现(初始化)
想法 如果楼主 你在头文件中 进行
a = 3 一个赋值操作
那么此时就强制给a进行了实例化 马上报错 说.obj文件中出现多个重定义
因为此时的a已经被实例化了 每个.obj里各有一个 自然报错

1.png

测试.rar (598.33 KB, 下载次数: 0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 13:50:55 | 显示全部楼层
.c/.cpp 编译-> .obj ->连接 .exe

一个.c或.cpp文件对应一个.obj文件, 然后一个或多个.obj文件连接起来生成.exe文件
只要.obj文件里没有重名冲突就可以通过
我按照楼主的方法试了下
error LNK2005: "int a" (?a@@3HA) 已经在 da.obj 中定义
会正常报错

楼主你看下彼此间的关联关系 是不是生成了.sda.obj 和da.obj 然后这两个obj文件连接后生成最后的exe文件

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 14:20:47 | 显示全部楼层
楼主 我觉得你的da.c和sda.c 没建立起联系

看下sda.c中是否还有一个fun函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 17:03:44 | 显示全部楼层
ryxcaixia 发表于 2015-6-18 13:50
.c/.cpp 编译-> .obj ->连接 .exe

一个.c或.cpp文件对应一个.obj文件, 然后一个或多个.obj文件连接起来 ...

可以正常运行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 17:05:18 | 显示全部楼层
ryxcaixia 发表于 2015-6-18 14:20
楼主 我觉得你的da.c和sda.c 没建立起联系

看下sda.c中是否还有一个fun函数

在 a.h 这个头文件中 声明了 fun() 这个函数的存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 17:57:46 | 显示全部楼层
sda.c与da.c 中的a分配的是两个不同内存单元,这两个内存单元互不影响。一个a是在fun()函数中,作用域当然限定于该函数,main()函数也是这样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-18 20:04:59 | 显示全部楼层
嫖客 发表于 2015-6-18 17:57
sda.c与da.c 中的a分配的是两个不同内存单元,这两个内存单元互不影响。一个a是在fun()函数中,作用域当 ...

连接的时候不是连接成一个可执行文件吗,这可执行文件不应该是包含了两个a.h了吗,难道是我想错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 21:48:40 | 显示全部楼层
哥斯拉不说话 发表于 2015-6-18 20:04
连接的时候不是连接成一个可执行文件吗,这可执行文件不应该是包含了两个a.h了吗,难道是我想错了?

应该是 a 在这里是全局变量;在main()中你可以对它赋值,在fun()中你依然可以改变其值;如果把int a不要写在头文件中,就可以达到你的想法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-19 08:35:33 | 显示全部楼层
亲 可以否把工程文件打个包传上来 我编译连接看看
是不是这两个obj文件生成的一个exe文件

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-19 10:20:36 | 显示全部楼层
a的作用域不同,a是局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-19 10:55:07 | 显示全部楼层
ryxcaixia 发表于 2015-6-19 08:35
亲 可以否把工程文件打个包传上来 我编译连接看看
是不是这两个obj文件生成的一个exe文件

这个链接的时候没报错,可以正常运行啊,但我就是感觉 a 定义了两遍,为什么没错啊?

测试.zip

190.18 KB, 下载次数: 2

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-19 14:15:56 | 显示全部楼层
我觉得有这个疑问就很好,你可以认为这样的写法就是错的。

事实上如果你对这个感兴趣,可以研究C编译器中的链接过程,这里定义的a属于“弱符号”,而初始化后成为“强符号”。。。但是研究这个问题不会对你的编程有太大的帮助,大概知道下就好。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-13 21:57:17 | 显示全部楼层
看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 03:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表