关于C语言中extern声明外部…

来源:互联网 发布:java怎么输出所有汉字 编辑:程序博客网 时间:2024/06/07 17:05
原文地址:关于C语言中extern声明外部变量的疑惑作者:Neville

   最近在做毕业设计,我是学电子信息工程专业,大学四年就学了C语言和一点点汇编语言,本人喜欢做硬件电路方面的东东,所以毕业设计选做硬件方向的课题,但是,现在电子科技的发展,已经软件、硬件分不开了,做硬件的同时也离不开通过软件编程来对硬件平台的开发。毕业设计期间,在编程上遇到点问题,很是困惑,问题虽然已经解决,但是,对问题本质仍没有很好的理解,固写于博客中,希望有识之士能在此给予指教。

 

   在说问题之前,先简单说一下有关extern的知识。来自谭浩强老师的C程序设计一书。

 

   外部变量是在函数的外部定义的全局变量,它的作用域是从变量的镍开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。有时需要用extern来声明外部变量,以扩展外部变量的作用域。

1、  在一个文件内声明外部变量

   如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。如果想在定义之前使用,刚应该在引用之前用关键字extern对该变量作“外部变量声明”。

2、  在多文件的程序中声明外部变量

   一个C程序可以由一个或多个源程序文件组成,如果程序只由一个源文件组成,使用外部变量的方法前面已经介绍。如果程序由多个源文件组成,那么在一个文件中想引用另一个文件中已定义的外部变量,应该怎么办?

    在任一个文件中定义的外部变量,而在另一个文件中用extern对其作“外部变量申明”,就将另一文件中的外部变量作用域扩展到本文件中了。

我遇到的问题是:我举例说明

[转载]关于C语言中extern声明外部变量的疑惑
[转载]关于C语言中extern声明外部变量的疑惑

Main()主函数:

[转载]关于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();
}

Lil9320.c文件:

[转载]关于C语言中extern声明外部变量的疑惑
#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);
}

运行结果:

[转载]关于C语言中extern声明外部变量的疑惑
 

疑惑:既然在lil9320.c文件中对a,b通过externa,b;进行了外部变量的作用域的扩展,那么为什么在lil9320.c文件中的子函数中使用a,b变量时,在函数中不定义形参为什么不可以??而定义了形参后就可以了??

最后,通过向别人学习,仔细看书才发现,书上面的例子是这样的,

File1.c中定义外部变量如下:int a;

File2.c中扩展外部变量作用域如下:extern a;

通过对比发现,我程序只有变量类型不一样,最后,我在我的lil9320.c文件中的extern a,b改为了externuchar a,b;就对了。

[转载]关于C语言中extern声明外部变量的疑惑
 

原来问题就在这,书上面能这样写extern a;省略变量类型是因为人家用的是int 类型啊,默认类型。只有int类型才可以省略啊!

    所以,看书一定要看仔细,看认真,编程一定要严格,本人编程经历太少了,不过对此问题以后不会再犯错了。发现了问题终于再一次证明了自己的编程能力是如此的不给力啊!以后努力学习,反省错误!

 

规格严格,功夫到家!

 

 

原创粉丝点击