当变量被定义在程序的不脱那个位置时,它的作用范围是不一样的,这个作用范围就是我们所说的作用域。
C语言编译器可以确认4种不同类型的作用域:
1.代码块作用域
#includeint main() { int i=100;//i1 { printf("i2=%dn",i); int i=111;//i2 { int i=333;//i3 printf("i3=%dn",i); } //出到了这里,i变回了111 { printf("i4=%dn",i); int i=666;//i4 printf("i4=%dn",i); } printf("i2=%dn",i); } printf("i1=%dn",i); return 0; }
运行结果:
lhy@ubuntu:~/xiaojiayu$ gcc p32-1.c lhy@ubuntu:~/xiaojiayu$ ./a.out i2=100 i3=333 i4=111 i4=666 i2=111 i1=100
2.文件作用域
#includevoid func(); int main() { extern int count; func(); count++; printf("In main,count=%dn",count); return 0; } int count; void func() { count++; printf("In func,count=%dn",count); }
运行结果:
lhy@ubuntu:~/xiaojiayu$ gcc p32-2.c lhy@ubuntu:~/xiaojiayu$ ./a.out In func,count=1 In main,count=2
3.原型作用域
4.函数作用域
二、链接属性
#includevoid a(); void b(); void c(); int count; int main() { a(); b(); c(); b(); printf("count=%dn",count); return 0; }
extern int count;
void a()
{
count++;
}
extern int count;
void b()
{
count++;
}
extern int count;
void c()
{
count++;
}
运行结果:
lhy@ubuntu:~/xiaojiayu$ gcc p32-3.c a.c b.c c.c lhy@ubuntu:~/xiaojiayu$ ./a.out count=4
#includevoid a(); void b(); void c(); static count; int main() { a(); b(); c(); b(); printf("count=%dn",count); return 0; }
extern int count;
void c()
{
count++;
}
运行结果:
lhy@ubuntu:~/xiaojiayu$ gcc p32-3.c a.c b.c c.c
p32-3.c:5:8: warning: type defaults to ‘int’ in declaration of ‘count’ [-Wimplicit-int]
static count;
^~~~~
/tmp/cck8WWlb.o: In function `a':
a.c:(.text+0x6): undefined reference to `count'
a.c:(.text+0xf): undefined reference to `count'
/tmp/ccbT0cJ9.o: In function `b':
b.c:(.text+0x6): undefined reference to `count'
b.c:(.text+0xf): undefined reference to `count'
/tmp/cc01llk8.o: In function `c':
c.c:(.text+0x6): undefined reference to `count'
/tmp/cc01llk8.o:c.c:(.text+0xf): more undefined references to `count' follow
collect2: error: ld returned 1 exit status
另:



