最近在做毕业设计,我是学电子信息工程专业,大学四年就学了C语言和一点点汇编语言,本人喜欢做硬件电路方面的东东,所以毕业设计选做硬件方向的课题,但是,现在电子科技的发展,已经软件、硬件分不开了,做硬件的同时也离不开通过软件编程来对硬件平台的开发。毕业设计期间,在编程上遇到点问题,很是困惑,问题虽然已经解决,但是,对问题本质仍没有很好的理解,固写于博客中,希望有识之士能在此给予指教。
在说问题之前,先简单说一下有关extern的知识。来自谭浩强老师的C程序设计一书。
外部变量是在函数的外部定义的全局变量,它的作用域是从变量的镍开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。有时需要用extern来声明外部变量,以扩展外部变量的作用域。
1、 在一个文件内声明外部变量
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。如果想在定义之前使用,刚应该在引用之前用关键字extern对该变量作“外部变量声明”。
2、 在多文件的程序中声明外部变量
一个C程序可以由一个或多个源程序文件组成,如果程序只由一个源文件组成,使用外部变量的方法前面已经介绍。如果程序由多个源文件组成,那么在一个文件中想引用另一个文件中已定义的外部变量,应该怎么办?
在任一个文件中定义的外部变量,而在另一个文件中用extern对其作“外部变量申明”,就将另一文件中的外部变量作用域扩展到本文件中了。
我遇到的问题是:我举例说明
#include <stdio.h>
#include "lil9320.h"
typedef unsigned char uchar;
typedef unsigned int
uint;
char a=0,b=0;
void change2(uchar a,uchar b)
{
printf("%dn",a);
printf("%dn",b);
}
void change3()
{
printf("%dn",a);
printf("%dn",b);
}
void main()
{
a=3;b=55;
printf("%dn",&a);
printf("%dn",&b);
printf("***************************************n");
change(a,b);
change1();
change2(a,b);
change3();
}
#include "lil9320.h"
extern
a,b;
void change(uchar a,uchar b)
{
printf("%dn",a);
printf("%dn",b);
}
void change1()
{
printf("%dn",a);
printf("%dn",b);
}
疑惑:既然在lil9320.c文件中对a,b通过extern a,b;进行了外部变量的作用域的扩展,那么为什么在lil9320.c文件中的子函数中使用a,b变量时,在函数中不定义形参为什么不可以??而定义了形参后就可以了??
最后,通过向别人学习,仔细看书才发现,书上面的例子是这样的,
File1.c中定义外部变量如下:int a;
File2.c中扩展外部变量作用域如下:extern a;
通过对比发现,我程序只有变量类型不一样,最后,我在我的lil9320.c文件中的extern a,b改为了extern uchar a,b;就对了。
原来问题就在这,书上面能这样写extern a;省略变量类型是因为人家用的是int 类型啊,默认类型。只有int 类型才可以省略啊!
所以,看书一定要看仔细,看认真,编程一定要严格,本人编程经历太少了,不过对此问题以后不会再犯错了。发现了问题终于再一次证明了自己的编程能力是如此的不给力啊!以后努力学习,反省错误!
规格严格,功夫到家!