当前位置: 代码迷 >> 综合 >> c++笔记3
  详细解决方案

c++笔记3

热度:84   发布时间:2024-03-07 01:43:01.0

                                                            关于变量的声明和定义

两者区别:

(声明):用于向程序表明变量的类型和名字,这里只是说明有这么个变量存在。

“声明”仅仅是告诉编译器某个标识符是:变量(什么类型)还是函数(参数和返回值是什么)。要是在后面的代码中出现该标识符,编译器就知道如何处理。记住最重要的一点:声明变量不会导致编译器为这个变量分配存储空间

 

(定义)告诉编译器建立变量并分配存储空间,并且给变量一个指定的初始值。

有了对比就很容易明白,定义变量意味着不仅告诉编译器变量的类型,而且编译器同时必须为变量分配空间。定义变量的同时还可以初始化变量,例如:

       int a = 9;

       char c = ‘A’;

 首先要搞清楚编译器在什么情况下将语句认为是定义,什么情况下认为是声明。这里给出若干原则:

(1)原则1:带有初始化的语句是定义

如:int a=1; //定义

 

(2)原则2:带有extern的语句是声明(除非对变量进行初始化)

如:extern int a; //声明

extern int a= 1; //定义


(3)原则3:既没有初始化又没有extern的语句是“暂时定义”(tentative definition)

如:int a; //暂时定义

 

注意:在C语言中,外部变量只能被(正式)定义一次

如:int a=1;

int a=1; //重复定义,报错

或者:

int a=0;

double a=1; //标识符a已经被使用,报错

 

 

暂时定义有点特殊,因为它是暂时的,我们不妨这样看:

暂时定义可以出现无数次,如果在链接时系统全局空间没有相同名字的变量定义,则暂时定义“自动升级”为(正式的)定义,这时系统会为暂时定义的变量分配存储空间,此后,这些相同的暂时定义(加起来)仍然只算作是一个(正式)定义。

如:

####################################################

int a; //暂时定义

int a; //暂时定义

int main()

{

 a=1;

 return 0;

}

int a; //暂时定义

#####################################################

注意:程序显示编译器只给变量“a”分配空间一次,尽管C程序中有3个暂时定义语句。

 

 

刚才讲到如果没有相同名字的外部变量定义,则暂时定义会自动变成定义,那么,如果有相同名字的外部变量定义呢?很简单,这时暂时定义的作用相当于声明。

例如:

int a; //暂时定义

int a; //暂时定义

int main()

{

 a=1;

 return 0;
}

int a=0; //定义

这里因为定义了外部变量,所以最上面的两个暂时定义就相当于仅仅声明a是int变量

####################################################################

总结

1.定义也是声明,即在定义变量时,我们既声明了它的类型和名字,又为该变量分配了内存空间及初始值

2.如果想声明一个变量而非定义它,就在变量名前添加关键字extern,通过extern关键字声明变量而不是定义,即不为该变量分配存储空间

3.extern声明的变量不要显式地初始化变量,任何包含显示初始化的声明就会变成定义。

我们能给由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用。extern语句如果包含初始值就不再是声明,而变成定义了:extern double pi = 3.1416; //定义

4.在函数体内部试图初始化一个由extern 关键字标记的变量,将引发错误

5.变量能且只能被定义一次,但可以被多次声明

6.如果要在多个文件中使用同一个变量,就必须将声明和定义分离。此时变量的定义必须出现且只能出现在一个文件中,而其他用到地方用到该变量的文件必须对其进行声明,但是却绝对不能重复定义该变量。

7.在头文件中不能放该变量的定义,一般放变量的声明。因为头文件要被其他文件引用包含,如果将“变量定义”放到头文件中就不能避免在其他文件被多次定义。

   变量的声明,如extern int i; 加extern关键字表示声明一个变量但不定义它,这对函数同样有效,如:extern int Add(int a, int b); 因为没有函数体编译器会把它视作声明而非定义。extern关键字对于函数来说是多余的、可选的。

最后要注意的是:

(1)变量的定义如:int i; 如果在此之前没有对i的声明,那么这里既是对它的声明也是对它的定义,编译器会为其分配对应的内存

(2)有三种实体的定义也可放在头文件中:

第一种:值在编译时就已知的const变量的定义可以放到头文件中

如:const int num=10;

第二种:类的定义可以放到头文件中

第三种:inline函数

  相关解决方案