`
talentluke
  • 浏览: 591320 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C变量声明和定义的区别

 
阅读更多
#include <stdio.h>
int a;
a=9;
void main(void)
{
printf("wjf\n");
int a;
a=6;
printf("a=%d,b=%d,c=%d,d=%d",a);
}


"main.c", line 3: cc0077: {D} error: this declaration has no storage class or
          type specifier
  a=9;
对变量的一般赋值不能放在函数外(只有在定义全局变量时的初始化才被允许),修改如下:

int a;
a=9;

改为

int a=9;
在函数外赋值 就变成了 函数外有了赋值语句。
c/c++ 程序结构不允许。
赋值语句要写在子程序里或主程序main()里。

在函数外,你可以用初始化;在全局中,语句的执行顺序是没有保证的,所以只能在声明的时候定义.

 

我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益)

变量的声明有两种情况:

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来声明,则该变量的作用只限于本文件模块。



摘自http://myswirl.blog.163.com/blog/static/51318642201011372125656/
很多初学者,对变量的定义和声明分不请,CC++ 中略有不同,再加上conststaticextern 就更加混乱,下面就此问题给予详细讲解并举例说明。

变量的定义:为变量分配存储空间,同时指明变量的类型和名字。另外变量的初始化,就是在变量的定义处给出值。

变量的声明:它主要向程序声明变量的类型和名字。

static修饰符:static int a;将变量的作用域限制在一个源文件内,对其他源文件a是不可见的。

严格的规则 :变量有且只能有一次定义,但是可以声明多次,使用变量前必须定义或声明。一个项目中可以有多个源文件,但在所有的源文件中只允许出现一次对某个变量的定义。

举例说明:

**************************************************************************

int i;          // 定义

int i=2;       // 定义

static int i;  //定义

extern int i=8; // 定义

extern int i;      // 这就是单纯的声明

*************************************************************************
问题1:如果外部变量的定义各指定一个初始值?大多数系统都会拒绝接受该程序。

C语言中变量声明和定义 - myswirl - myswirl
 
问题2:如果一个外部变量在多个源程序中定义却未指定初始值?某些系统可能会接受,例如VC6.0
同样的程序在VC++无法编译通过。
C语言中变量声明和定义 - myswirl - myswirl
 如果要在所有的C语言实现中避免上述问题,惟一的解决办法就是每个外部变量只定义一次

问题3:同一变量名在不同文件中声明为不同的类型?需要程序员自己检查。
C语言中变量声明和定义 - myswirl - myswirl

解决上述问题,只需接受一个简单的规则:每个外部变量只在一个头文件中声明,需要用到外部变量的地方都应该包括这个头文件,特别指出,定义该外部变量的模块也应该包括这个头文件。


分享到:
评论

相关推荐

    C语言静态变量和静态函数

    C_语言静态变量和静态函数,可以让您对C语言静态变量和静态函数有更清晰的认识

    C/C++语言中全局变量重复定义问题的解决方法

    在C语言中使用extern 关键字来定义全局变量的时候,我们需要在.h文件和.c文件中重复定义,这种重复,导致了出错几率的增加。 今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面。于是,...

    枚举类型定义与变量声明定义的不同方法

    枚举类型定义与变量声明定义的不同方法,使用vc++ 6.0编写

    c代码-函数定义声明和全局变量

    c代码-函数定义声明和全局变量

    c语言中头文件的建立与使用-函数、全局变量、全局数组

    头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#i nclude语句将头文件引用时,相当于将头文件中所有内容,复制到#i nclude处。为了避免因为重复引用而导致的编译错误...

    c/c++中变量的声明和定义深入解析

    不管是函数还是变量的声明 ,都是为了告诉编译器我要使用这个变量或者函数了,用于类型检查。在定义 的时候编译器是不会分配任何内存的, 比如下面的函数: 代码如下:void func() { int a ; int b = 0 ; a = 0 ;}...

    C语言的 变量.docx

    在C语言中,变量是用来存储数据值的内存位置。在使用变量之前,需要先声明变量的类型和名称...在C语言中,变量的作用域可以是全局的或局部的,全局变量在整个程序中都可以访问,而局部变量只能在定义它的代码块中访问。

    C++ 编译单元概述和全局变量的声明和定义

     一个,链接时的错误,主要是重复定义变量等。  编译单元指在编译阶段生成的每个obj文件。  一个obj文件是一个编译单元。  一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元。  一个工程由很多编译...

    关于C中函数声明与定义

    总结如下:1.一般情况下,函数在调用子函数时,子函数必须先声明,要不会报错。(一般都将函数的声明放在一下头文件里)2.如若子函数为返回值是int时,...3.static修饰的函数作用域为从声明/定义处到源文件结尾处为止。

    c语言全局变量和局部变量问题及解决汇总

    1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用”::” 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,...

    C、C++面试题.pdf

    面试题1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件...

    浅谈内联函数与宏定义的区别详解

    文章(一)内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如: #define MAX(a,b) ((a)&gt;(b)?(a):(b)) 该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)&gt;(b)?...

    浅析JavaScript声明变量

    JavaScript的变量声明语句无论出现在何处,都会先于其他代码首先被执行。使用var关键词声明变量的作用域是当前的执行上下文,有可能是外围函数,或者,当变量声明在函数体之外时,则为全局变量。 定义在函数体外的都...

    union变量的外部调用方法,亲测编译通过

    union变量在多个函数调用时涉及到变量定义及外部声明的问题,该文档所述该类型变量的声明和调用已在亲测编译通过,希望对大家有所帮助

    2.2变量定义和赋值的实际操作

    //C89规定,变量定义必须在程序的第一条可执行语句之前定义 //C99取消了这个限制,它允许变量定义语句在变量使用之前的任何位置定义都可以 int a; //一个语句中定义多个变量,多个变量之间用逗号来分割 float x...

    50个C、C++面试题

    面试题 1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入 extern修饰的是变量的声明,说明此变量将在文件以外...

    [面试/笔试系列9]C/C++经典面试题

    面试题1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或...

    详解c++ 静态成员变量

    ·C/C++·有声明和定义的说法:声明给出签名,定义给出具体实现。对类型而言,声明不一定能知道其对象占用空间大小,但根据定义肯定能确定内存占用。说静态成员与C++方式是相容的,因为其初始化方式与方法的定义一致...

    基于C++全局变量的声明与定义的详解

    (1)编译单元(模块)在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件;...(2)声明与定义函数或变量在声明时,并没有给它

    PHP 变量的定义方法

    变量的定义 ⚑变量的类型 ⚑变量的使用 变量即是存在于内存中可以不断变化的一个个对象,我们可以将内存想象成一个街道,街道中有许多住户,每位住户都会有自己的门牌号码,这就好比是内存中的地址(C语言中经常提到...

Global site tag (gtag.js) - Google Analytics