搜索
bottom↓
回复: 16

ICCAVR全局变量定义求助

[复制链接]

出0入0汤圆

发表于 2008-5-12 10:55:32 | 显示全部楼层 |阅读模式
我在ICCAVR中有三个文件main.c,   q1.c,   q2.c
在这三文件中都要用到同一个数组timer[8],这肯定要定义为全局变量了.
在main.c中我定义为extern timer[8],在q1.c,   q2.c中一个定义为timer[8],一个定义为extern timer[8], 这样编译就通过.那 timer[8]在项目中就是全局变量吗?

还有:在main.c中我定义为extern timer[8],在在q1.c,   q2.c中如果全定义为extern timer[8], 编译就报错,这是啥原因呀?
请指点,谢谢

出0入0汤圆

发表于 2008-5-13 22:17:37 | 显示全部楼层
请C比较熟悉的朋友解答一下.

出0入0汤圆

发表于 2008-5-14 13:38:30 | 显示全部楼层
个人感觉全局变量定义在.H文件中比较好
这样.C调用的时候只要在前面加一个#include "头文件名.h"就好了

出0入0汤圆

发表于 2008-5-14 13:45:51 | 显示全部楼层
【楼主位】 sxbo:在main.c中我定义为extern timer[8],在在q1.c,   q2.c中如果全定义为extern timer[8], 编译就报错,这是啥原因呀?
-----------------------------------------------------------------------------------------------------------
你这样是都没有定义呀,只是声明。一定要在某个文件里定义,而其它文件里只能用extern来声明。就像你前面说的一样。

【2楼】 xmrforever 尽在掌握:个人感觉全局变量定义在.H文件中比较好
这样.C调用的时候只要在前面加一个#include "头文件名.h"就好了
---------------------------------------------------------------------
你说的是错的,如果有几个文件同时包含有该头文件,就会提示你重复定义了。正确的做法是在一个C文件中定义,然后在头文件中声明为extern timer[8],其它用到的文件把这个头文件#include就OK了。

出0入0汤圆

发表于 2008-5-14 13:49:31 | 显示全部楼层
在main.c中我定义为extern timer[8],在q1.c,   q2.c中一个定义为timer[8],一个定义为extern timer[8], 这样编译就通过.那 timer[8]在项目中就是全局变量吗?

==>是的.


还有:在main.c中我定义为extern timer[8],在在q1.c,   q2.c中如果全定义为extern timer[8], 编译就报错,这是啥原因呀?
==>不能全部都为外部变量,必须有一个,而且只能有一个是实体变量的定义.至于在哪里定义,根据每个人的习惯.

出0入0汤圆

发表于 2008-5-14 14:05:56 | 显示全部楼层
请3楼的朋友说的更为详细一些
我照您说的方法做了一下,出现如下错误:
--------------------Configuration: doublefile - Win32 Debug--------------------
Linking...
doublefile1.obj : error LNK2005: _main already defined in doublefile.obj
doublefile1.obj : error LNK2001: unresolved external symbol "int timer1" (?timer1@@3HA)
Debug/doublefile.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

doublefile.exe - 1 error(s), 0 warning(s)

出0入0汤圆

发表于 2008-5-14 14:24:22 | 显示全部楼层
光看你的这个错误提示我也不知道问题在哪里?要不你把程序贴出来。

出0入0汤圆

发表于 2008-5-14 16:12:52 | 显示全部楼层
定义全局变量表示在全局堆中分配世纪的空间,并且分配一个符号名。
声明外部变量,给一个符号名字,不分配空间,由连接器进行实际的连接,如果在连接文件中找不到这个符号名报错。
定义不等于声明。

出0入0汤圆

发表于 2008-5-15 13:43:35 | 显示全部楼层
程序很简单
doublefile.c
#include <stdio.h>
void main()
{
        int timer1;
        timer1=9;
        printf("%d",timer1);
}

doublefile1.c
#include <stdio.h>
#include "doublefile.h"
void main()
{
        printf("%d",timer1);
}

doublefile.h
extern timer1;

请指教

出0入0汤圆

发表于 2008-5-15 14:26:14 | 显示全部楼层
咳,说什么好呢?"尽在掌握"你是根本连C都没有掌握.上面的程序说明什么?有两个main?

出0入0汤圆

发表于 2008-5-15 15:09:35 | 显示全部楼层
除马老师所说的两个main()错之外,还有你没把timer1定义为全局变量

出0入0汤圆

发表于 2008-5-15 16:12:30 | 显示全部楼层
【楼主位】 sxbo       我在ICCAVR中有三个文件main.c,   q1.c,   q2.c
这3个文件是什么意思?
和我建的两个文件是不是同一个意思?

出0入0汤圆

发表于 2008-5-15 16:17:37 | 显示全部楼层
【11楼】 xmrforever 尽在掌握:【楼主位】 sxbo       我在ICCAVR中有三个文件main.c,   q1.c,   q2.c
这3个文件是什么意思?
和我建的两个文件是不是同一个意思?
---------------------------------------------------------------------------------------------------------------
楼主的意思是一个project中有三个.c的文件。但只有一个文件中含有main。而你的是两个都有main,当然不一样了

出0入0汤圆

发表于 2008-5-15 16:20:28 | 显示全部楼层
那我明白了
我理解错了
让大家见笑了

出0入0汤圆

发表于 2008-5-15 16:26:56 | 显示全部楼层
我把程序改了一下
doublefile.c
#include <stdio.h>
int timer1;
void main()
{
        void file();
        timer1=9;
        printf("%d",timer1);
        file();
}

doublefile1.c
#include <stdio.h>
#include "doublefile.h"
void file()
{
        printf("%d",timer1);
}

doublefile.h
extern timer1;

这样就没问题了.

出0入0汤圆

发表于 2008-6-6 00:35:55 | 显示全部楼层
extern timer1; 不用类型也行吗

出0入0汤圆

发表于 2011-11-8 10:09:24 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 02:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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