前言
本文讲解C中的作用域。
代码块作用域(Block scope)
代码块(Block)是以{...}
包裹起来的一组语句。
#include <stdio.h>
#define PRTP(x) \
printf("%s: %d: %p\n", #x, (x), &(x))
int a = 4; /* 全局作用域 'a' */
int main(void){
int a = 0; /* main 函数作用域内的 'a' */
a++; /* main 函数内的 'a'++ */
PRTP(a);
{
int a = 4; /* 第2个 'a' */
a *= 2; /* 第2个'a'*=2 */
PRTP(a);
}
a = 128; /* main 函数内的'a'=128 */
PRTP(a);
return 0;
}
不同代码块作用域内的同名变量,它们的地址是不一样的。即使名字相同,也不会有重复定义的问题。如果在不同代码块内重定义同名变量,代码块内部会屏蔽外部变量。
#include <stdio.h>
int main(void){
{
int n = 64;
}
printf("%d\n", n); /* 报错 */
return 0;
}
在代码块外部无法访问到代码块内部的变量,外部变量对于代码块内不可见。
#include <stdio.h>
#define PRTP(x) \
printf("%s: %d: %p\n", #x, (x), &(x))
int main(void){
int n = 64;
{
n *= 2;
PRTP(n); /* OK */
}
return 0;
}
而在代码块内可以访问代码块外的变量。
代码块作用域内的全部变量都会在函数退出时右花括号}
消亡,函数参数也属于函数代码块作用域。(要将所有本地变量出栈拿到返回地址)