C语言全局变量extern、static的含义

下边的代码分别是什么含义?

int a;

int a=0;

static int a;

static int a = 0;

extern int a;

extern int a = 0;//ERROR

1.变量声明和定义的区别?

变量可以有多次声明,但只能有一次定义。

声明只是说我有这个变量,也有可能这个变量不是在我这个文件中开辟的内存空间,所以声明可以有多次。定义只能有一次,如果一个变量有多次定义,则链接时就会困惑不知道是该链接哪一个,访问变量时也不能确定访问的是哪个。

将C语言梳理一下,分布在以下10个章节中:

Linux-C成长之路(一):Linux下C编程概要

Linux-C成长之路(二):基本数据类型

Linux-C成长之路(三):基本IO函数操作

Linux-C成长之路(四):运算符

Linux-C成长之路(五):控制流

Linux-C成长之路(六):函数要义

Linux-C成长之路(七):数组与指针

Linux-C成长之路(八):存储类,动态内存

Linux-C成长之路(九):复合数据类型

Linux-C成长之路(十):其他高级议题

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

C++11中正则表达式测试

int a;是声明还是定义?

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

1

2

3

4

5

 

int a;

int main()

{

a = 0; //在这里,可以给变量a赋值,说说明上方int a 是定义。

}

 

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

如果此时我们单纯的认为int a;就是定义了一个变量,那么我们在int a;下再加一句int a;如下:

int a;

int a;

int main()

{

a = 0;

}

编译是否通过?结果会让我们大吃一惊。

如果按照上述结论int a是定义的话,现在就应该会报重定义的错了,可是编译器并没有报错,为什么呢?

这就说明:不能简单凭借有没有赋初值来判断变量是声明还是定义。赋了值的一定是定义,没有赋值的可以是声明也可以是定义,要根据语境来判断。

例子中int a;可能是声明也可能是定义。如果代码中出现多次int a;编译器则会把其中一个当成定义,其他都会看成声明。也就是说像int a;这样没有给它赋初值的语句可以是声明也可以是定义。

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

int a=1;

int a;

int main()

{

a = 0;

}

没有错,第一句是定义,第二句是声明

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

但是像下边这样

int a=1; //给a开辟了一块内存

int a=1; //给a开辟了一块内存

int main()

{

a = 0;

}

就会报重定义的错了。因为这相当于每条语句都为a开辟了一块内存,在链接的时候就不知道a到底是那块内存了

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

在单个c源文件中很清楚,关于变量的错误主要是在多个相互联系的源文件中。

====a.h============

int a;

===================

***b.c*************

#include"a.h"

int main()

{

a = 0;

}

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

***c.c**************

#include"a.h"

int main()

{

a = 0;

}

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

这个时候在b.c中 c.c中都有一个int a; 编译程序gcc b.c c.c 没问题,因为这个时候其中一个是定义,另一个是声明。

2.extern的含义?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c2dfb257ba152f45042a06a91839e6ef.html