文档库 最新最全的文档下载
当前位置:文档库 › 4.14关于C 变量的声明和定义

4.14关于C 变量的声明和定义

4.14关于C  变量的声明和定义

我们已经知道,一个函数一般由两部分组成:声明部分和执行语句。

声明部分的作用是对有关的标识符(如变量?函数?结构体?共用体等)的属性进行说明。对于函数,声明和定义的区别是明显的,前边已说明,函数的声明是函数的原型,而函数的定义是函数功能的确立。对函数的声明是可以放在声明部分中的,而函数的定义显然不在函数的声明部分范围内,它是一个文件中的独立模块。

对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如int a;);另一种是不需要建立存储空间的(如extern int a;)。前者称为定义性声明(defining declaration),或简称为定义(definition)。后者称为引用性声明(referenceing declaration)。广义地说,声明包括定义,但并非所有的声明都是定义。对“int a;”而言,它是定义性声明,既可说是声明,又可说是定义。而对“extern int a;”而言,它是声明而不是定义。一般为了叙述方便,把建立存储空间的声明称为定义,而把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。

例如:

int main()

{

extern int a;//这是声明不是定义。声明a是一个已定义的外部变量

}

int a;//是定义,定义a为整型外部变量

外部变量定义和外部变量声明的含义是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。系统根据外部变量的定义分配存储单元。对外部变量的初始化只能在定义时进行,而不能在声明中进行。所谓声明,其作用是向编译系统发出一个信息,声明该变量是一个在后面定义的外部变量,仅仅是为了提前引用该变量而作的声明。extern只用作声明,而不用于定义。

用static来声明一个变量的作用有二:

?对局部变量用static声明,使该变量在本函数调用结束后不释放,整个程序执行期间始终存在,使其存储期为程序的全过程。

?全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。

请注意,用auto,register,static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。如“static a;”是不合法的,应写成“static int a;”。

C语言中变量和函数的声明与定义

变量 在将变量前,先解释一下声明和定义这两个概念。声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同时还可以对变量进行初始化。 局部变量通常只定义不声明,而全局变量多在源文件中定义,在头文件中声明。 局部变量 在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效。自动变量auto 函数中的局部变量,其缺省格式是自动变量类型。例如,在函数体中int b, c=3。和auto int b, c=3。是等价的。 自动变量是动态分配存储空间的,函数结束后就释放。自动变量如不赋初值,则它的值是一个不确定的值。 静态局部变量static 静态局部变量是指在函数体内声明和定义的局部变量,它仅供本函数使用,即其他函数不能调用它。静态局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次函数调用时,该变量已有值,就是上一次函数调用结束时的值。 静态局部变量在静态存储区分配存储单元,在程序的整个运行期间都不释放。静态局部变量是在编译时赋初值的,即只赋初值一次。

在SDT编译器中,建议对静态局部变量赋初值,否则该静态局部变量的初值为不确定值。在其他编译器中,未初始化的静态局部变量的初值可能为零,这由具体的编译器所决定,使用前最好测试一下。 寄存器变量register 带register修饰符的变量暗示(仅仅是暗示而不是命令)编译程序本变量将被频繁使用,如果可能的话,应将其保留在CPU的寄存器中,以加快其存取速度。 对于现有的大多数编译程序,最好不要使用register修饰符。因为它是对早期低效的C编译程序的一个很有价值的补充。随着编译程序技术的进步,在决定哪些变量应当被存到寄存器中时,现在的C编译程序能比程序员做出更好的决定。 全局变量 在函数之外定义的变量称为外部变量,外部变量是全局变量,它可以为本文件中其他函数所共用。全局变量都是静态存储方式,都是在编译时分配内存,但是作用范围有所不同。 静态外部变量static 静态外部变量只能在本文件中使用。所以静态外部变量应该在当前源文件中声明和定义。 外部变量extern 定义函数中的全局变量时,其缺省格式是外部变量类型。外部变量应该在一个头文件中声明,在当前源文件中定义。外部变量允许其他文件引用。

若变量均已正确定义并赋值

若变量均已正确定义并赋值,以下合法的C语言赋值语句是(c)。 A、x+n=I; B、x==5; C、x=n/2.5; D、5=x=4+1; 下述错误的C语言常量是:( c). A、0xf B、5. C、090 D、.25 根据下面的程序,使a=123,c1='o',c2='k'哪一种是正确的键盘输入方法?(b )。(规定用字符串[CR]表示回车,U表示空格) main() {int a; char c1,c2; scanf("%d%c%c", &a,&c1,&c2); } A、123UoUk[CR] B、123ok[CR] C、123Uok[CR] D、123oUk[CR] 已知键入a=4,b=3,执行下面程序输出的结果是( b). main() { int a,b,s; scanf("%d%d",&a,&b); s=a; if(a>b) s=b; s=s*s; printf("%d\n", s); } A、13 B、9 C、16 D、15 执行下面程序段后,i的值是( a). int i=10; switch(i) {case 9: i+=1; case 10: i--; case 11: i*=3; case 12: ++i; } A、28 B、10 C、9 D、27 以下不是无限循环的语句为(d)。

A、while(1){x++;} B、for(;;x++=i); C、for(i=10;;i--) sum+=i; D、for(y=0,x=1;x>++y;x=i++) i=x 下面程序段运行的结果是(a ). x=-1; do{ x=x*x; }while (!x); A、循环执行一次 B、有语法错误 C、死循环 D、循环执行两次 若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是(a)。 A、3 B、无确定值 C、4 D、2 若定义int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};char c='a',d,g; 则数值为4的表达式是 ( d). A、a[4] B、a[g-c] C、a['d'-'c'] D、a['d'-c] 以下叙述中正确的是(c)。 A、可以在一个函数中定义另一个函数 B、main()函数必须放在其它函数之前 C、构成C程序的基本单位是函数 D、所有被调用的函数一定要在调用之前进行定义 下述函数的功能是(c ). int fun(char *x) { char *y=x; while(*y++); return y-x-1; } A、比较两个字符串的大小 B、求字符串存放位置 C、求字符串的长度 D、将字符串x连接到字符串y后面 有关"文件包含"命令说法,下列叙述正确的是( a). A、将预处理的结果作为一个源程序编译,得到一个目标文件. B、一个 include 命令可指定多个被包含文件. C、将预处理的结果作为多个文件编译. D、被包含的文件可以是源文件或目标文件. 在声明语句:int *f();中,标识符f代表的是(a)。 A、一个返回值为指针型的函数名 B、一个用于指向函数的指针变量 C、一个用于指向一维数组的行指针 D、一个用于指向整型数据的指针变量

变量的定义与声明

1.变量的定义 从前面的章节可以看出,程序中所有的东西几乎都有名字。然而字面量却是个例外,它没有名字。那么使用变量,我们就可以为某个值取名字了。实际上,我们是为系统内存中用于保存数据的某块空间取名字。 ANSI C规定:变量必须“先定义、后使用”,因此当用C定义变量时,不仅需要指定变量名,而且还必须告诉编译器其存储的数据类型,变量类型告诉编译器应该在内存中为变量名分配多大的存储单元,用来存放相应变量的值(变量值),而变量仅仅是存储单元的别名,供变量使用的最小存储单元是字节(Byte)。 由此可见,每个变量都占据一个特定的位置,每个存储单元的位置都由“地址”唯一确定并引用,就像一条街道上的房子由它们的门牌号码标识一样。即从变量中取值就是通过变量名找到相应的存储地址,然后读取该存储单元中的值,而写一个变量就是将变量的值存放到与之相应的存储地址中去。 由于变量的定义不是可执行代码,因此要求局部变量的定义必须位于用“{}包围的程序块”的开头,即在可执行代码的前面。比如: int lower_limit = 80; //定义lower_limit为整型变量 即在定义lower_limit为int类型数据时,系统就已经为变量lower_limit分配了存储单元。请注意区分变量名和变量值这两个不同的概念,其中,lower_limit为变量名,80为变量lower_limit的值,即存放在变量lower_limit的存储单元中的数据。 那么到底如何获得变量的地址呢?C语言使用“&(地址运算符)加变量名”的方式获取变量的地址,比如,&lower_limit就代表变量lower_limit的地址,详见后续相关章节的描述。 一个定义只能指定一种变量类型,虽然后面所带的变量表可以包含一个或多个该类型的变量: int lower_limit , upper_limit , sum; 但如果将一个定义语句中的多个变量拆开在多个定义语句中定义的话: int lower_limit; // lower_limit为数据下限 int upper_limit;// upper_limit为数据上限 int sum;// sum为求和的结果

变量声明、关键字和类型

模块三变量声明、关键字和类型 模块三变量声明、关键字和类型 (1) 1. 基本语法元素 (2) 1.1. 注释 (2) 1.2. 分号 (2) 1.3. 语句块(block) (3) 1.4. 空白 (4) 2. 标识符 (4) 3. Java关键字 (5) 4. 基本Java数据类型 (5) 4.1. 逻辑型──boolean (6) 4.2. 字符型──char (6) 4.3. 文本类──String (7) 4.4. 整数型──byte, short, int, long (7) 4.5. 浮点数──float和double (8) 5. 变量、声明和赋值 (8) 6. 引用(Reference)类型 (9) 6.1. 创建一个新类型 (9) 6.2. 创建并初始化一个对象 (10) 6.3. 存储器分配和布局 (10) 6.4. 引用类型的赋值 (11) 6.5. 值传递 (12) 6.6. this引用 (14) 7. Java编码约定 (15) 8. 练习:使用对象 (16) 8.1. 创建一个类和相应的对象 (16) 8.2. 检验引用赋值 (16) 9. 检查你的进度 (17)

本模块阐述了在Java技术中使用的基本元素,包括变量、关键字、原始类型和类类型。 完成本模块的学习后,你应该能够: -区分有效和无效标识符 -识别Java技术关键字 -列出八个原始类型 -为数字类型和文本类型定义文字值 -解释术语class、object、member variable和reference variable -为一个简单的包含原始成员变量的类创建一个类定义 -声明类类型变量 -使用new构造一个对象 -描述缺省初始化 -使用点符号访问一个对象的成员变量 -描述一个引用变量的意义 -描述分配类类型变量的结果 3.1 基本语法元素 3.1.1 注释 注释是程序员用来标记、说明程序的。编译器会忽略注释中的内容,注释中的内容不会对程序的运行产生任何影响。Java语言允许三种风格的注释: // 单行注释 /* 多行注释 */ /** 文档注释 */ 3.1.2 分号 在Java编程语言中,语句是一行由分号(;)终止的代码。 例如 totals=a+b+c+

C语言的变量声明与定义的区别

从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。 对于下面的两句代码: void Func() { int a; int b=1; a=0; } 对于第一行代码,编译器不会做任何事,它不会为它在栈中分配一点东西,直到第三句, a=0;时,编译器才会将其压入栈中。而对于int b=0;这一句,编译器就会生成一条指令,为它赋值。如果反汇编,看到的代码可能是这样的: push 1; push 0; 当然,并不一定编译器就会样做,也有可能在声明int a时,编译器就会把一个废值入栈,到第三条再为其赋值,这要看编译器的具体取舍,所以,声明不一定不是定义,而定义一定是定义。 但是,下面的声明,一定仅仅是声明: extern int a; 这表时,有一个int变量a,它一定是在另外其他地方定义的,所以编译器此时一定不会做什么分配内存的事,因为它就是声明,仅仅表明下面的代码引用了一个符号,而这个符号是int类型的a而已。 变量的声明,其实就是一个空的东西,在C中就相当与一个空的指针,它什么也没有指向,没有任何实际的意义,例如int a。 而变量的定义,就不一样了,它是在内存中指定了一定的空间,一旦定义一个变量,系统自动给它分配一定的内存空间。它是有一定的实际意义的。例如int a=10。 两者区别: 声明不为变量分配空间,而定义为变量分配空间 因此同一个变量的声明可以出现多次,而只能定义一次 中函数的声明是可以重复的,但是变量却不可以。对于变量的声明都会分配内存空间,只是这部分内存空间里存放的是随机值,直到被定义之后将赋予相应的值。

变量的声明和定义之间的区别和联系

变量的声明和定义之间的区别和联系 前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于 extern a 来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明,例如:在主函数中: int main() { extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量 //注意:声明外部变量时可以把变量类型去掉如:extern A; dosth(); //执行函数 } int A; //是定义,定义了A为整型的外部变量 外部变量的“定义”与外部变量的“声明”是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在“定义”中进行,而不是在“声明”中。所谓的“声明”,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是为了“提前”引用该变量而作的“声明”而已。extern 只作声明,不作任何定义。 (我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。)

C语言中变量的声明和定义的关系

C语言中变量的声明和定义的关系 在英文里有两个词涉及这个问题:declare 和 define,在中文中这两个词都可以翻成“定义”,但在C语言中他们有不同的意义;让我们称declare=声明,define=定义。 “声明(declare)”是用于定义一个变量的类型;“定义(define)”是用于定义一个变量所占用的存储;显然,一个变量的类型可以定义多次,只要他们不互相矛盾即可;而一个变量的存储只能定义一次,否则程序如何用一个变量名访问多于一个的存储空间呢? 每次引用一个变量时,引用变量的语句行之前必须出现该变量的声明,该声明可以是直接出现在这个语句行所在的源文件中,或出现在一个头文件中,该源文件用include包含这个头文件。 一个项目中可以有多个源文件,但在所有的源文件中只允许出现一次对某个变量的定义。 这里借用“新手园地”中小罗纳耳朵的一个问题作为例子: 我用Keil写程序时,子程序里需要用到定义一个数组 array[]={0x01,0x02} 放在main函数里定义会提示array未定义! 但是如果放在头文件config.h里面定义为: extern code unsigned CHAR array[]={0x01,0x02}; 结果编译时出现 MULTIPLE PUBLIC DEFINITIONS定义。但是我的头文件里面已经用预处理

命令了 #ifndef __CONFIG_H__ #define __CONFIG_H__ 头文件的内容 #endif 为什么还会出现这种重复定义的错误? 他的错误是,下面这行是定义array的存储,而他又把这行放到了头文件config.h中,等于是在多个源文件中重复地定义array的存储: extern code unsigned CHAR array[]={0x01,0x02}; 正确的做法是在头文件中用这样的声明语句(必须加extern,否则变成定义存储了):extern code unsigned CHAR array[]; // 声明array是一个外部变量 然后在某个源文件中加入这样的语句(此处不必加extern): code unsigned CHAR array[] = {0x01, 0x02}; // 定义array的存储

变量定义与声明的区别(精)

变量定义与声明的区别我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下: 变量的声明有两种情况: (1 一种是需要建立存储空间的(定义、声明。例如:int a在声明的时候就已经建立了存储空间。 (2 另一种是不需要建立存储空间的(声明。例如:extern int a其中变量a是在别的文件中定义的。前者是"定义性声明(defining declaration"或者称为"定义(definition",而后者是"引用性声明(referncing declaration"。从广义的角度来讲声明中包含着定义,但是并非所有的声明都是定义,例如:int a它既是声明,同时又是定义。然而对于extern a来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为"定义",而把不需要建立存储空间称之为"声明"。很明显我们在这里指的声明是范围比较窄的,也就是说非定义性质的声明。例如:在主函数中 int main( { extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量 //注意:声明外部变量时可以把变量类型去掉如:extern A; dosth(; //执行函数 } int A; //是定义,定义了A为整型的外部变量(全局变量外部变量(全局变量的"定义"与外部变量的"声明"是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明也可以在函数之外(在外部变量的定义点之前。系统会根据外部变量的定义(而不是根据外部变量的声明分配存储空间的。对于外部变量来讲,初始化只能是在"定义"中进行,而不是在"声明"中。所谓的"声明",其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是在为了"提前"引用该变量而作的"声明"而已。extern只作声明,不作定义。用static来声明一个变量的作用有二: (1 对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在 (2 外部变量用static来声明,则该变量的作用只限于本文件模块

C++声明、定义、变量、数据类型专题

本文作者:黄邦勇帅 本文是学习C++最基础的内容,因此应对其熟练掌握,本文主要介绍了声明与定义的区别,C++中有关变量及数据类型的描述,其中由浅入深的介绍了复杂声明的分析方法,本文内容由浅入深,内容较为全面。 本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。 声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。 主要参考文献: 1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社2005年5月 2、C++.Primer.Plus.第四版.中文版Stanley B.Lippman、Barbara E.Moo著李师贤等译人民邮电出版社2006年3月 3、C语言:标准与实现volume 1 作者不详,前言是“姚新颜”写的可能就是作者,出版社不详,2004年8月 4、《程序设计语言C》中华人民共和国国家标准GB/T 15272-94 1994年12月7日发布出版社不详 5、《C++程序设计原理与实践》[美]Bjarne Stroustrup著王刚刘晓光吴英李涛译机械工业出版社2010年6月 6、《C++程序设计语言》特别版[美]Bjarne Stroustrup著裘宗燕译机械工业出版社2010年3月 7、《C和指针》第二版[美] Kenneth A.Reek著徐波译人民邮电出版社出版日期不详 8、《C陷阱与缺陷》Andrew Koenig 著高巍译王昕审校人民邮电出版社出版日期不详 9、《C专家编程》作者、出版社、出版日期不详 10、《C语言核心技术》Peter Prinz εTony Crawford著O’Reilly Taiwan公司译机械工业出版社2007年8月 11、《ANSI C标准详解》作者、出版社、出版日期不详 第3部分声明、定义、变量、数据类型专题 关键概念 1、对象:指的是某种类型所占据的一片连续的内存单元,注意:对象不仅仅指的是一片连续的内存单元,而且这片内 存区域已经指定了某种类型。 2、标识符:标识符就是一个名字,使用标识符主要是与C++中的关键字相区别,本文所讲的名字和标识符都是指的标 识符。 一、变量、类型简单理解请参考《C++整型、字符型、浮点型专题》相关内容。 二、变量、对象、实体深度理解 1、注意:本文中的对象与类的对象是两个概念,应区别对待。 2、对象:指的是某种类型所占据的一片连续的内存单元,注意:对象不仅仅指的是一片连续的内存单元,而且这片内 存区域已经指定了某种类型。 3、变量:变量其实就是命名后的对象,也就是说变量是为指定类型的连续的内存单元(即对象)取的一个名字。一块连 续的内存单元,若我们使用内存的地址编号来访问这块内存单元,这样会让程序很难让人理解,因此就有必要为一块保存特定类型的连续的内存单元(即对象)取一个名字,这个名字就是我们所说的变量。 4、实体:本文中所说的实体就是变量的另一个名字,一般情况下变量指的是像整型,浮点型这些类型的对象,按变量 的概念,变量还可以是函数名,指针名,数组名等,为了描述方便,有时会使用实体一词。 5、从以上概念可以看出,变量、对象和实体三者的没有什么本质的区别。 三、类型深度理解 1、类型与内存 内存中的比特值的含义完全决定于这块内存单元所表示的类型,保存在计算机中的值是一些二进制比特,这些二进制比特对于计算机来讲,它并不知道代表什么意义,只有当我们决定如何解释这些比特时才有意义,比如65或字符’a’在内存中的比特值是相同的,若将比特值解释为int型,则他是一个十进制数,若解释为char型,则是这符a,因此在内存单元中的数据应具有一个类型,当类型确定后就能对其中的数据作出正确的解释了。 2、类型的作用 1)、类型决定了可以将什么数据赋给对象(比如整数3可以赋给int型,”dd”可以赋给string型等) 2)、类型决定了可以对该对象进行什么样的操作(比如可以对int型的变量或常量进行加、减、乘、除等操作,不能 进字符串变量或常量进行加、减、乘、除等操作)。 3)、类型还决定了对象的内存大小、布局和取值范围 3、每个名字(或变量,变量就是命名后的对象,因此一个变量就是一个名字)、表达式都应有一个类型,这个类型决定

变量声明和定义的区别

变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 2、另一种是不需要建立存储空间的。例如:extern int a 其中变量a是在别的文件中定义的。 前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于extern a 来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明,例如:在主函数中: int main() { extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量 //注意:声明外部变量时可以把变量类型去掉如:extern A; dosth(); //执行函数 } int A; //是定义,定义了A为整型的外部变量 外部变量的“定义”与外部变量的“声明”是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在“定义”中进行,而不是在“声明”中。所谓的“声明”,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是为了“提前”引用该变量而作的“声明”而已。extern 只作声明,不作任何定义。 (我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。) 用static来声明一个变量的作用有二: (1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。 (2)外部变量用static来声明,则该变量的作用只限于本文件模块。

变量声明表

在回答你的问题之前,有必要对变量声明表有一个基本了解。在STEP7中有两种用来定义符号地址的表格形式:符号表(共享符号)和变量声明表(局域符号),其本质都是为了建立绝对地址与符号地址之间的内在联系,但表格针对的对象不同。共享符号是整个程序所使用的共同符号(用于全局符号定义的表为符号表);而局域符号是某一特定逻辑快(OB、FB、FC等)所使用的临时性标记,只能在特定的逻辑块中进行临时性定义。用于临时性的、局域符号定义的表被称为变量声明表,又称局部变量声明表。 局部变量声明表分为参数(输入参数IN、输出参数OUT、输入/输出参数IN_OUT)和局部变量。局部变量又包括静态变量(STAT)和临时变量(TEMP)两种。参数可在调用块(逻辑块,块中的形参)和被调用块(功能FB有自己自动生成的背景数据块DI,而功能FC只能使用共享数据块,提供调用块的形参的实际参数值,与调用块形式参数一一对应,数据类型必需一致)。静态变量和临时变量是仅供逻辑块本身使用数据,不能用作不同程序块之间的数据接口。通过以上分析,我们知道所谓局部变量(包括静态变量和暂态变量)都是指对特定的逻辑块而言的,局部变量只是在它所在的块中有效,离开具体的逻辑块谈上述变量是没有意义的,你不能在其他块中调用利用变量(包括静态变量和暂态变量),这是与共享符号不一致的,共享符号可以被任意块

调用。在每个逻辑块的前上面部分就是变量声明表的区域,在变量声明表中,用户声明本块中专用的变量,即局部变量包括块的形参和参数的系统属性。你可以在不同的块中使用相同的局部变量符号不会产生冲突。 静态变量(STAT)在PLC运行期间始终被存储。S7 将静态变量定义在背景数据块(针对FB而言,FC和OB无静态变量),当被调用块运行时,能读出或修改静态变量;被调用块结束后,静态变量保留在数据块中; 临时变量(TEMP)是一种在块执行时,用来暂时存储数据的变量,这些数据存储在CPU工作存储区的局部数据堆栈(L 堆栈)中。临时变量可以在组织快OB、功能FC和功能块FB中使用,当块执行时它们被用来临时存储数据,一旦块执行介绍,堆栈重新分配,临时变量中的数据将丢失。 在程序块中,如果在块的变量声明表中有局部变量符号,编程是STEP7软化自动在局部变量名前加一个“#”号,如果要访问与局部变量重名的全局变量(在符号表中定义),则全局变量必须使用双引号(如“Symbol”)

C语言变量的声明和空间的分配

无论用什么语言编制的程序,都是为让计算机完成某一特定功能而编写的文本文件。这些文本文件是不能直接在机器上运行的,它们必须经过系统软件(包括编辑器和编译器)的输入并编译或汇编后,转换成二进制的可执行代码,才是计算机可以识别的机器语言。此时,程序就是一个包含二进制可执行代码文件的模块。当内核把二进制的可执行代码装入内存后,它由三部分组成:代码段、数据段、堆栈段。在线性地址的低地址字段是代码段,存放程序经编译后的可执行代码(程序文本)。在操作系统中,代码段是只读的,不能修改,所以,代码段的长度是不会改变的。在程序文本(代码段)的上方是数据段,用来存放程序的变量、字符串和其它数据。它分为初始化静态数据(data)和未初始化静态数据(BSS。数据段的长 度是可以改变的。程序可以修改其中的变量。在程序设计中,将其值可以改变的量称为变量。每一个变量在内存中都要占据一定的存储单元,因此,每一个变量也就会具有一定的存储属性。 从变量的作用域(空间)的角度来考虑变量的属性,可将变量分为全局变量和局部变量。 局部变量 局部变量是指在一个函数内部定义的变量,它只中本函数范围内有效。 说明: 1、在主函数中定义的变量只在主函数中有效,且主函数也不能使用其他函数中定义的变量 2、在不同函数中可以使用相同名字的变量,它们代表不同的变量,互不干扰; 3、形参也是局部变量,也只在对应的函数中有效,其他函数不能使用 4、在一函数内部,可在复合语句(有一个{} 括起的一组语句)中定义变量,这些变量只在本复合语句中有效。 全局变量 程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数之外定义的变量称为外部变量(extern ), 也叫全局变量。全局变量的有效范围是从定义变量的位置开始到本源程序文件结束为止,其关键字extern 可以省略。 说明: 1、在一个函数中既可以使用本函数中的局部变量,又可以使用有效的全局变量。 2、设置全局变量的作用是增加函数间数据联系的渠道。由于同一文件中的若干函数均能引用全局变量

4.14关于C 变量的声明和定义

我们已经知道,一个函数一般由两部分组成:声明部分和执行语句。 声明部分的作用是对有关的标识符(如变量?函数?结构体?共用体等)的属性进行说明。对于函数,声明和定义的区别是明显的,前边已说明,函数的声明是函数的原型,而函数的定义是函数功能的确立。对函数的声明是可以放在声明部分中的,而函数的定义显然不在函数的声明部分范围内,它是一个文件中的独立模块。 对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如int a;);另一种是不需要建立存储空间的(如extern int a;)。前者称为定义性声明(defining declaration),或简称为定义(definition)。后者称为引用性声明(referenceing declaration)。广义地说,声明包括定义,但并非所有的声明都是定义。对“int a;”而言,它是定义性声明,既可说是声明,又可说是定义。而对“extern int a;”而言,它是声明而不是定义。一般为了叙述方便,把建立存储空间的声明称为定义,而把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。 例如: int main() { extern int a;//这是声明不是定义。声明a是一个已定义的外部变量 } int a;//是定义,定义a为整型外部变量 外部变量定义和外部变量声明的含义是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。系统根据外部变量的定义分配存储单元。对外部变量的初始化只能在定义时进行,而不能在声明中进行。所谓声明,其作用是向编译系统发出一个信息,声明该变量是一个在后面定义的外部变量,仅仅是为了提前引用该变量而作的声明。extern只用作声明,而不用于定义。 用static来声明一个变量的作用有二: ?对局部变量用static声明,使该变量在本函数调用结束后不释放,整个程序执行期间始终存在,使其存储期为程序的全过程。 ?全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。 请注意,用auto,register,static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。如“static a;”是不合法的,应写成“static int a;”。

C语言在头文件中定义全局变量

头文件定义全局变量等问题 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 可以,在不同的C文件中以static形式来声明同名全局变量。头文件中不可以直接定义变量和函数,但是可以定义static变量,类。 extern 用法,全局变量与头文件(重复定义) 用#include可以包含其他头文件中变量、函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或函数a,我只要直接在源文件中包含 #include (xxx.h包含了a的声明)不就可以了么,为什么还要用extern 呢??这个问题一直也是似是而非的困扰着我许多年了,今天上网狠狠查了一下总算小有所获了: 头文件 首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的。 我做过一个实验,将头文件的后缀改成xxx.txt,然后在引用该头文件的地方用 #include"xxx.txt" 编译,链接都很顺利的过去了,由此可知,头文件仅仅为阅读代码作用,没其他的作用了! 不管是C还是C++,你把你的函数,变量或者结构体,类啥的放在你的.c或者.cpp 文件里。然后编译成lib,dll,obj,.o等等,然后别人用的时候最基本的 gcc hisfile.cpp yourfile.o|obj|dll|lib 等等。但对于我们程序员而言,他们怎么知道你的lib,dll...里面到底有什么东西?要看你的头文件。你的头文件就是对用户的说明。函数,参数,各种各样的接口的说明。那既然是说明,那

么头文件里面放的自然就是关于函数,变量,类的“声明”了。记着,是“声明”,不是“定义”。那么,我假设大家知道声明和定义的区别。所以,最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量: #ifndef _XX_头文件.H #define _XX_头文件.H int A; #endif 那么,很糟糕的是,这里的int A是个全局变量的定义,所以如果这个头文件被多次引用的话,你的A会被重复定义显然语法上错了。只不过有了这个#ifndef的条件编译,所以能保证你的头文件只被引用一次,不过也许还是会岔子,但若多个c文件包含这个头文件时还是会出错的,因为宏名有效范围仅限于本c源文件,所以在这多个c文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量, Linking... incl2.obj : error LNK2005: "int glb" already defined in incl1.obj Debug/incl.exe : fatal error LNK1169: one or more multiply defined sy mbols found 注意!!! extern 这个关键字真的比较可恶,在声明的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和函数两类来说: (1)变量 尤其是对于变量来说。 extern int a;//声明一个全局变量a int a; //定义一个全局变量a extern int a =0 ;//定义一个全局变量a 并给初值。 int a =0;//定义一个全局变量a,并给初值,第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是extern int a=0;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。

C语言中变量和函数的声明与定义

变量在将变量前,先解释一下声明和定义这两个概念。声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同时还可以对变量进行初始化。 局部变量通常只定义不声明,而全局变量多在源文件中定义,在头文件中声明。 局部变量在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效。 自动变量auto 函数中的局部变量,其缺省格式是自动变量类型。例如,在函数体中int b, c=3; 和auto int b, c=3; 是等价的。 自动变量是动态分配存储空间的,函数结束后就释放。自动变量如不赋初值,则它的值是一个不确定的值。 静态局部变量static 静态局部变量是指在函数体内声明和定义的局部变量,它仅供本函数使用,即其他函数不能调用它。静态局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次函数调用时,该变量已有值,就是上一次函数调用结束时的值。静态局部变量在静态存储区分配存储单元,在程序的整个运行期间都不释放。静态局部变量是在编译时赋初值的,即只赋初值一次。 在SDT编译器中,建议对静态局部变量赋初值,否则该静态局部变量的初值为不确定值。在其他编译器中,未初始化的静态局部变量的初值可能为零,这由具体的编译器所决定,使用前最好测试一下。 寄存器变量register 带register 修饰符的变量暗示(仅仅是暗示而不是命令)编译程序本 变量将被频繁使用,如果可能的话,应将其保留在CPU勺寄存器中,以

加快其存取速度。 对于现有的大多数编译程序,最好不要使用register 修饰符。因为它 是对早期低效的C编译程序的一个很有价值的补充。随着编译程序技术的进步,在决定哪些变量应当被存到寄存器中时,现在的C编译程序能比程序员做出更好的决定。 全局变量 在函数之外定义的变量称为外部变量,外部变量是全局变量,它可以为本文件中其他函数所共用。全局变量都是静态存储方式,都是在编译时分配内存,但是作用范围有所不同。 静态外部变量static 静态外部变量只能在本文件中使用。所以静态外部变量应该在当前源文件中声明和定义。 外部变量extern 定义函数中的全局变量时,其缺省格式是外部变量类型。外部变量应该在一个头文件中声明,在当前源文件中定义。外部变量允许其他文件引用。 下例声明了一个变量和一个结构,定义了两个变量,其中一个定义带初 始化: extern int decl1; // this is a declaration struct decl2 { int member; }; // this just declares the type - no variable

变量定义与声明概念辨析与区别

关于定义与声明 例如:在主函数中 int main() { extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量 //注意:声明外部变量时可以把变量类型去掉如:extern A; dosth(); //执行函数 } int A; //是定义,定义了A为整型的外部变量(全局变量) 外部变量(全局变量)的"定义"与外部变量的"声明"是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在"定义"中进行,而不是在"声明"中。所谓的"声明",其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是在为了"提前"引用该变量而作的"声明"而已。extern只作声明,不作定义。 用static来声明一个变量的作用有二: (1) 对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在 (2) 外部变量用static来声明,则该变量的作用只限于本文件模块 *************************THE END*************************

**************************BEGIN************************** Declarations and Definitions As we'll see in Section 2.9 (p. 67), C++ programs typically are composed of many files. In order for multiple files to access the same variable, C++ distinguishes between declarations and definitions. 就像我们在2.9 (p. 67)节看到的一样,典型的C++程序通常会由好多文件组成。为了使不同的文件都可以访问同一个变量,C++会区分变量的声明(declarations)和定义(definitions)。 A definition of a variable allocates storage for the variable and may also specify an initial value for the variable. There must be one and only one definition of a variable in a program. 变量的定义(definitions)会为这个变量分配存储空间,并且可能会为其指定一个初始化的值。在程序里,一个变量必须有一个,也只能有一处定义(definitions)。 A declaration makes known the type and name of the variable to the program. A definition is also a declaration: When we define a variable, we declare its name and type. We can declare a name without defining it by using the extern keyword. A declaration that is not also a definition consists of the object's name and its type preceded by the keyword extern: 变量的声明(declarations)会将变量的类型和名称传达给程序。当然,定义(definitions)也是一种声明:当我们定义一个变量的时候,我们当然也声明了他的名称和类型。我们可以通过使用“extern”关键字来声明(declarations)一个变量,而不用定义(definitions)它。声明(declarations)的形式就是在对象(变量)的名字和类型前面,加上关键字“extern”: extern int i; // declares but does not define i int i; // declares and defines i An extern declaration is not a definition and does not allocate storage. In effect, it claims that a definition of the variable exists elsewhere

相关文档
相关文档 最新文档