为什么不提示重复定义?
两个 c 文件都包含了“a.h”这个头文件,为什么不提示 变量 a 重复定义? 本帖最后由 ryxcaixia 于 2015-6-19 11:48 编辑昨天撸多了 明显思路错误了
楼主 是这样的 在头文件中int a 相当于extern a 即在头文件中定义的变量 并没有被分配内存空间
仅仅做声明作用而没有被实现(初始化)
想法 如果楼主 你在头文件中 进行
a = 3 一个赋值操作
那么此时就强制给a进行了实例化 马上报错 说.obj文件中出现多个重定义
因为此时的a已经被实例化了 每个.obj里各有一个 自然报错
.c/.cpp 编译-> .obj ->连接 .exe
一个.c或.cpp文件对应一个.obj文件, 然后一个或多个.obj文件连接起来生成.exe文件
只要.obj文件里没有重名冲突就可以通过
我按照楼主的方法试了下
error LNK2005: "int a" (?a@@3HA) 已经在 da.obj 中定义
会正常报错
楼主你看下彼此间的关联关系 是不是生成了.sda.obj 和da.obj 然后这两个obj文件连接后生成最后的exe文件
楼主 我觉得你的da.c和sda.c 没建立起联系
看下sda.c中是否还有一个fun函数 ryxcaixia 发表于 2015-6-18 13:50
.c/.cpp 编译-> .obj ->连接 .exe
一个.c或.cpp文件对应一个.obj文件, 然后一个或多个.obj文件连接起来 ...
可以正常运行啊 ryxcaixia 发表于 2015-6-18 14:20
楼主 我觉得你的da.c和sda.c 没建立起联系
看下sda.c中是否还有一个fun函数
在 a.h 这个头文件中 声明了 fun() 这个函数的存在 sda.c与da.c 中的a分配的是两个不同内存单元,这两个内存单元互不影响。一个a是在fun()函数中,作用域当然限定于该函数,main()函数也是这样。 嫖客 发表于 2015-6-18 17:57
sda.c与da.c 中的a分配的是两个不同内存单元,这两个内存单元互不影响。一个a是在fun()函数中,作用域当 ...
连接的时候不是连接成一个可执行文件吗,这可执行文件不应该是包含了两个a.h了吗,难道是我想错了? 哥斯拉不说话 发表于 2015-6-18 20:04
连接的时候不是连接成一个可执行文件吗,这可执行文件不应该是包含了两个a.h了吗,难道是我想错了?
应该是 a 在这里是全局变量;在main()中你可以对它赋值,在fun()中你依然可以改变其值;如果把int a不要写在头文件中,就可以达到你的想法 亲 可以否把工程文件打个包传上来 我编译连接看看
是不是这两个obj文件生成的一个exe文件
a的作用域不同,a是局部变量 ryxcaixia 发表于 2015-6-19 08:35
亲 可以否把工程文件打个包传上来 我编译连接看看
是不是这两个obj文件生成的一个exe文件
这个链接的时候没报错,可以正常运行啊,但我就是感觉 a 定义了两遍,为什么没错啊? 我觉得有这个疑问就很好,你可以认为这样的写法就是错的。
事实上如果你对这个感兴趣,可以研究C编译器中的链接过程,这里定义的a属于“弱符号”,而初始化后成为“强符号”。。。但是研究这个问题不会对你的编程有太大的帮助,大概知道下就好。
看不懂
页:
[1]