嵌入式之家

 找回密码
 现在注册

QQ登录

只需一步,快速开始

搜索
热搜: ARM cortex
查看: 1780|回复: 3

c语言定义变量

[复制链接]

该用户从未签到

45

主题

115

帖子

1543

积分

金牌会员

Rank: 6Rank: 6

积分
1543
发表于 2016-2-24 19:38:14 | 显示全部楼层 |阅读模式
我们在进行嵌入式开发时,最常用的语言就是c语言,在定义变量时,一般有两种方法:
第一种:在一个c文件里定义变量,另外一个c文件中需要引用时,使用extern在当前文件再次声明一下,这种方式存在一个弊端,那就是如果有多个文件引用这个变量,那么每个文件中就都需要是使用extern关键字对该变量进行声明;
第二种就是在c文件中定义变量,而在c文件对应的头文件中使用extern关键字对其进行声明,这样其他文件要引用该变量时,只需要将该文件的头文件包含进去就可以了。
      那么为什么不能在C语言的头文件里定义变量呢?
   让我们来举个例子,假设有如下工程:
    该工程包含如下文件:
第一个文件:
test.h文件
#ifndef __TEST_H
#define __TEST_H


unsigned int testValue;
unsigned int changeValue( void );

#endif
test.c文件
#include "test.h"
unsigned int changeValue( void )
{
         testValue= 1;
        return testValue;
}
main.c文件
#include "test.h"
unsigned int globeValue;
void main( )
{
     testValue = 5;
     globeValue = changeValue();
      while(1);
}
我们将changeValue放入watchwindow中,单步运行,查看testValue的变化
发现当运行了globeValue =changeValue();后,testValue的值没有变化,仍然是5,为什么会这样呢?
因为当在test.h中定义testValue变量时,test.h被引用几次,就产生了几个不同的testValue全局变量,所以尽可能不要在头文件中定义变量。
回复

使用道具 举报

该用户从未签到

32

主题

81

帖子

771

积分

高级会员

Rank: 4

积分
771
发表于 2016-2-24 22:33:36 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

1

主题

50

帖子

222

积分

版主

Rank: 7Rank: 7Rank: 7

积分
222
发表于 2016-2-25 16:53:33 | 显示全部楼层
在keil4中不可以在头文件中定义变量后,在多个C文件中引用,会提示错误:
.\Obj\PGM-1500xx.axf: Error: L6200E: Symbolxxx multiply defined (by timer.o and main.o).

在标准C里就不知道了
回复 支持 反对

使用道具 举报

该用户从未签到

55

主题

168

帖子

1767

积分

金牌会员

Rank: 6Rank: 6

积分
1767
发表于 2016-3-7 10:23:53 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 现在注册

本版积分规则

QQ|Archiver|手机版|小黑屋|嵌入式之家 ( 京ICP备14038168号-1 )

GMT+8, 2024-5-20 21:29 , Processed in 0.019250 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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