c语言中全矩变量定义,C语言——全局变量的定义与声明

转自:html

C语言中全局变量的定义与声明困扰着许多C语言初学者。本文讲述了全局变量定义与声明的用法,并且本为也将阐述这种用法的内在原理。咱们先从两个错误例子引入,如下两个例程都在vc6.0平台上测试。测试

两种错误例程this

1.unresolved external symbolhtm

例子包含两个C文件(test.c)和(first.c)和一个头文件(test.h)。下边具体展现下它们的代码。对象

test.h内容blog

#ifndef _TEST_H

#define _TEST_H

extern int count;   ip

#endif内存

test.c内容get

#include

#include "test.h"

extern void Fis_Cal(void);

void main(void)

{

Fis_Cal();

printf("the present value of count is %d\n",count);

}

first.c内容

#include

#include "test.h"

void Fis_Cal(void)

{

printf("the last value of count is %d\n",count);

count = 1;

}

错误分析:test.h头文件中声明了全局变量count,可是在两个C文件中都没有对count进行定义,因此才会出现unresolved external symbol。

一种解决方法:随便在两个C文件中加入一句“int count;”就OK了。例如咱们加到test.c中,代码以下。

#include

#include "test.h"

extern void Fis_Cal(void);

int count;

void main(void)

{

Fis_Cal();

printf("the present value of count is %d\n",count);

}

说明:加入的“int count;”就是对count的定义,默认的将其初始化为0。

结论:这种错误缘由是“只声明未定义”。

2.multiply defined symbols found

仍是如此,三个文件。可是,两个C文件与例程一中的文件同样,改动的只是头文件。

test.h内容

#ifndef _TEST_H

#define _TEST_H

int count;

#endif

能够看到,与例程一仅仅差了一个“extern”关键词。

错误分析:test.h头文件中定义了全局变量count,可是在两个C文件都经过“#include "test.h"”这句话对“int count;”进行了引用,因此形成了重复定义的错误。

一种解决方法:添加一个“first.h”的头文件,而且更改first.c的内容,具体更改以下。

first.h内容

#ifndef _FIRST_H

#define _FIRST_H

extern int count;

#endif

first.c内容

#include

#include "first.h"

void Fis_Cal(void)

{

printf("the last value of count is %d\n",count);

count = 1;

}

说明:通过这样的修改,原来的test.c中就包含了count的定义,而first.c中就包含了对count的声明,重复定义错误就获得解决。

结论:这种错误缘由是“多个C程序都包含了定义全局变量的头文件”。

原理分析

我认为“int count;”是对全局变量的定义,而“extern int count”是对全局变量的声明,目的是让其余文件也使用这个全局变量。下边咱们来挖掘全局变量的定义与声明的内涵。

全局变量要么初始化(非零),要么没有初始化(为零)。非零时存储在程序中的data段,零时存储在程序的bss段。这谈了程序(.bin或者.hex)的结构。我再讲一下程序的启动,程序在启动(boot)过程当中,一般都会运行一个叫bootloader的引导程序,这个引导程序干了不少事情,其中有一最重要的任务就是把程序(test段和rodata段)拷贝到内存,还包括data段的拷贝和bss段初始化。咱们着重讲一下data段的拷贝和bss段初始化。

咱们的编译器会为咱们定义的全局变量分配内存(地址),并且给咱们的全局变量赋初值(写内存或清零),之后咱们的程序就会根据须要来读这个全局变量(地址)或者修改这个全局变量(写内存)。初值为零时就在bss段,这个段初始化代码会将这部分清零。初值非零时,初始化代码会将全局变量的初值拷贝到data段。

那么,显然全局变量的初值只有一个。咱们程序中的全局变量的定义就是对全局变量分配内存并赋初值。而全局变量的声明是为了跨文件使用全局变量的须要,经过"extern"关键词来将全局变量引出。

顺便说一下C语言的存储类说明符,这能帮助咱们加深理解。

C语言的存储类说明符

Auto 只在块内变量声明中被容许, 表示变量具备本地生存期。

Extern 出如今顶层或块的外部变量函数与变量声明中,表示声明的对象具备静态生存期, 链接程序知道其名字。

Static 能够放在函数与变量声明中,在函数定义时,只用于指定函数名,而不将函数导出到连接程序,在函数声明中,表示其后边会有定义声明的函数,存储类型static.在数据声明中,老是表示定义的声明不导出到链接程序关键字。

一种更好的声明与定义方式

test.h内容

#ifndef _TEST_H

#define _TEST_H

#ifdef GLOBALS

int count;

#else

extern int count;

#endif

#endif

test.c内容

#define GLOBALS

#include

#include "test.h"

extern void Fis_Cal(void);

void main(void)

{

Fis_Cal();

printf("the present value of count is %d\n",count);

}

first.c内容

#include

#include "test.h"

void Fis_Cal(void)

{

printf("the last value of count is %d\n",count);

count = 1;

}

说明:这种方法能够只定义一个头文件实如今不一样C文件中分别实现定义与声明。“#define GLOBALS”只在当前定义的test.c文件中有效,因此在test.c中#include "test.h"预处理后,加入的是int count,而first.c中加入的"extern int count;"。其实还有一种书写方法,也能实现这个效果。

test.h内容

#ifndef _TEST_H

#define _TEST_H

#ifdef GLOBALS

#define EXT

#else

#define EXT extern

#endif

EXT int count;

#endif 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值