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

上面的例子如果将a.h中 int a;改为 int a = 0;则编译器就会报a被多次定义的错了。对应上边所说的赋了值的一定是定义。没赋值的可以是声明也可以定义。

int a比较明显。有的可能会在头文件中写成const char* item[]={"aa","bb"};这时编译也会报错。这和int a=0;没有区别。所以在头文件中我们应该避免给变量赋初值。

头文件里只对变量进行声明这个时候就应该加上extern关键字 extern int a;

这个时候就表示 这个a只在这个头文件中声明,而不是在这里定义的,是在某一个cpp文件中定义,开辟内存的。extern关键字就代表只是声明一个变量,所以文章开头 extern int a=0;是错误的 因为只是声明并没有为它开辟空间是不可以赋值的。

这个时候就可以在c.c里 int a=10;为a定义。 在b.c里就可以访问a了。代码如下:

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

extern int a;

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

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

include "a.h"

int a = 10;

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

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

include "a.h"

void main()

{

printf("%d",a); //这个时候多个文件include头文件a.h就可以正常访问变量a了,a实际是在c.c里赋的值

}

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

3.static 是什么含义?

翻译过来就是静态的意思。还是原来的例子。

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

extern int a;

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

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

include "a.h"

staitc int a = 10;

void main()

{

printf("the a in c.c is %d",a);

}

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

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

include "a.h"

staitc int a = 100;

void main()

{

printf("the a in b.c is %d",a);

}

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

这个时候没有报错。static关键字表示 这个a只在自身范围内有效。和外边没有关系。不会和外边去链接,所以没有冲突,b.c和a.c里的a不是同一块内存 是各自的内存。

extern 函数也是一样。

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

extern int add(int var1);

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

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

include "a.h"

staitc int a = 10;

int add(int var1)

{

a+=var1;

}

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

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

include "a.h"

staitc int a = 100;

void main()

{

add(15);

printf("the a in b.c is %d",a); //结果仍是100

}

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

说明 extern的方法改变的a是方法被定义的文件(c.c)里的变量a

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

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