有大量现金的行业:变量定义与声明的区别

来源:百度文库 编辑:中财网 时间:2024/05/11 02:57:04
关于定义与声明
**************************BEGIN**************************
变量定义与声明的区别
变量的声明有两种情况:
(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来声明,则该变量的作用只限于本文件模块
*************************THE END*************************
**************************BEGIN**************************
Declarations and Definitions
As we'll see inSection 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)。
Adeclaration 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 in the program. A variable can be declared multiple times in a program, but it must be defined only once.
带“extern”关键字的语句属于声明(declarations),不是定义(definitions),他不会给变量分配内存。实际上,它是说明程序中的某处包含这个变量的定义。一个变量可以在程序中被声明(declarations)多次,但是只能被定义(definitions)一次。
A declaration may have an initializer only if it is also a definition because only a definition allocates storage. The initializer must have storage to initialize. If an initializer is present, the declaration is treated as a definition even if the declaration is labeled extern:
声明(declarations)时你可以给变量初始化。但是一旦你这样做,那么这句话也就变成了定义(definitions),因为只有在定义(definitions)的时候才会为变量分配内存。初始化的时候必然要为初始值分配存储空间。如果你在声明(declarations)的时候同时初始化了变量,即便“extern”关键字存在,这个语句也会认为是定义(definitions)。
extern double pi = 3.1416; // definition
Despite the use of extern, this statement defines pi. Storage is allocated and initialized. An extern declaration may include an initializer only if it appears outside a function.
不管有没有“extern”关键字存在,这条语句的作用也是定义(definitions)“pi”。变量已经被分配了内存,并且赋予了初始值。声明(declarations)只有在一种情况下可以被初始化,那就是当他被放置在函数外部的时候。
Because an extern that is initialized is treated as a definition, any subseqent definition of that variable is an error:
由于包含初始化的声明(declarations)语句会被认为是定义(definitions),所以如下的用法会被认为是错误的:
extern double pi = 3.1416; // definition
double pi;                // error: redefinition of pi
Similarly, a subsequent extern declaration that has an initializer is also an error:
同样的,定义(definitions)后再使用同样的声明(declarations)也是错误的:
extern double pi = 3.1416; // definition
extern double pi;         // ok: declaration not definition
extern double pi = 3.1416; // error: redefinition of pi
The distinction between a declaration and a definition may seem pedantic but in fact is quite important.
声明(declarations)和定义(definitions)之间的区别看似有些卖弄学问的嫌疑,但是其实是非常重要的。
Note
In C++ a variable must be defined exactly once and must be defined or declared before it is used.
笔记
在C++里,变量必须被定义一次,最多一次,至少一次,而且必须在使用前定义(definitions)或者声明(declarations)。
Any variable that is used in more than one file requires declarations that are separate from the variable's definition. In such cases, one file will contain the definition for the variable. Other files that use that same variable will contain declarations for but not a definition of that same variable.
任何一个在多个文件中都要用到的变量都需要在没有其定义(definitions)的文件里对其进行声明(declarations)。在这样的情况下,一般一个文件会包含该变量的定义(definitions)。其他用到该变量的文件就会包含该变量的声明(declarations),而不是定义(definitions)。
*************************THE END*************************
**************************BEGIN**************************
Declaration reforms programs to know the called function,whereas definition let the compiler allocate a certain entity for the function.A function could be declared many times while definition is unique.A definition must contain a function body:{/.../}
*************************THE END*************************
**************************BEGIN**************************
小谈声明(Declaration)和定义(Definition)
-----written by kernelxu(kernelxu@hotmail.com)
-----大部分内容来自博客小鱼研发手记的文章《变量的定义和声明的差别》
(http://blog.codelphi.com/leven/archive/2005/06/16/44793.aspx)
今天读到林锐的书《高质量C++/C编程指南》,对其中的声明和定义内容颇有微辞。 声明(Declaration)用于说明每个标识符的含义,而并不必为每个标识符预存储空间。预留存储空间的声明称为定义(Definition)。声明的形式为:声明说明符 声明符声明符是由存储类说明符和类型说明符组成的。
1、变量的声明有两种情况: 一种是需要建立存储空间的。
例如:int a 在声明的时候就已建立了存储空间。
2、另一种是不必建立存储空间。
例如:extern int a 其中 变量a是在别的文件中定义的。
例一:
Declaration.
A construct which associates attributes to a variable name or function. No storage is reserved. For example:
extrn int a;
extrn char c;
variable declaration A structure decleration could look like:
Definition.
Variable definition is a declaration with storage allocation.
struct per_rec
{
int age;
char *surname;
char *firstname;
};
int a;
char c;
struct per_rec person;
A construct which specifies the name,parameters and return type of a function. For example a function definition would be:
long sqr(int num)
{
return(num*num);
}
前者是"定义性声明(defining declaration)"或称为"定义(definition)",而后者是"引用性声明(referncing declaration)" 。从广义的角度来讲 声明中包含着定义,不过并非所有的声明都是定义,例如:int a 他既是声明,同时又是定义。然而对于 extern a 来讲他只是声明不是定义。他能在同一源程式或不同的源程式中重复声明。一般的情况下我们常常这样叙述,把建立空间的声明称之为"定义",而把不必建立存储空间称之为"声明"。非常明显我们在这里指的声明是范围比较窄的,也就是说非定义性质的声明。
例如:在主函数中
int main()
{
int a;         //这里是定义(分配空间的声明),他不能重复出现
//这里若写extern int a;或 int a;在VC6.0中编译均报错重复定义
//(redefinition)
//这里写int a;在DEV-C++中编译报错重复声明(redeclaration)
//这里写extern int a;在DEV-C++中编译、运行均无问题
extern int A;  //这是个声明而不是定义,声明A是个已定义了的外部变量
//注意:声明外部变量时能把变量类型去掉如:extern A;
dosth();       //执行函数
}
int A;            //是定义,定义了A为整型的外部变量
看来定义还是声明有时和编译器的处理也有关系。
外部变量的"定义"和外部变量的"声明"是不相同的,外部变量的定义只能有一次,他的位置是在所有函数之外,而同一个文件中的外部变量声明能是多次的,他能在函数之内(哪个函数要用就在那个函数中声明)也能在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在"定义"中进行,而不是在"声明"中 。
所谓的"声明",其作用,是声明该变量是个已在后面定义过的外部变量,仅仅是在为了"提前"引用该变量而作的"声明"而已。 extern 只作声明,不作所有定义 。
用static来声明一个变量的作用有二:
(1) 对于局部变量用static声明,则是为该变量分配的空间在整个程式的执行期内都始终存在。
(2) 外部变量用static来声明,则该变量的作用只限于本文件模块。
进一步内容可查看:http://www-ccs.ucsd.edu/c/declare.html
*************************THE END*************************