我们可以在C中的不同函数中声明相同的局部静态变量吗?

时间:2013-06-04 08:39:57

标签: c function static

我们可以在C?

中的不同函数中声明相同的局部静态变量

例如:

in function1:
void function1()
{
   static int a;
   a++;
   //dosomething here
}

in function2:
void function2()
{
   static int a;
   a++;
   //dosomething here
}

in function3:
void function3()
{
   static int a;
   a++;
   //dosomething here
}

在这种情况下,如果我调用function1三次,那么我调用函数function3一次,如果函数3中a的值是4还是1?

2 个答案:

答案 0 :(得分:5)

这是三个不同的变量。他们碰巧有相同的名字。改变一个的值不会改变另一个的值。

变量具有可见的关联范围。来自C99标准的 6.2.1标识符范围

  

标识符可以表示对象;功能;标签或结构,联合或枚举的成员;一个typedef名称;标签名称;一个宏名;或宏参数。 相同的标识符可以表示程序中不同点的不同实体。枚举的成员称为枚举常量。这里不再考虑宏名称和宏参数,因为在程序转换的语义阶段之前,源文件中任何宏名称的出现都由构成其宏定义的预处理令牌序列替换。

  

对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本区域内可见(即,可以使用)。由相同标识符指定的不同实体具有不同的范围,或在不同的名称空间。 有四种范围:函数,文件,块和函数原型。(函数原型是声明其参数类型的函数的声明。)

  

每个其他标识符的范围由其声明的位置(在声明符或类型说明符中)确定。如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,标识符具有文件范围,该文件范围终止于翻译单元的末尾。如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关联块的末尾。如果声明标识符的声明符或类型说明符出现在函数原型(不是函数定义的一部分)的参数声明列表中,则标识符具有函数原型作用域,该作用域终止于函数声明符的末尾。如果标识符指定同一名称空间中的两个不同实体,则范围可能会重叠。如果是这样,一个实体(内部范围)的范围将是另一个实体(外部范围)范围的严格子集。在内部范围内,标识符指定在内部范围内声明的实体;在外部作用域中声明的实体在内部作用域内是隐藏的(并且不可见)。

发布代码中的每个a(标识符)都有 function 范围,因此不会干扰另一个函数中声明的a

  

静态变量将自动初始化0?

static指定a的生命周期,即静态存储持续时间。来自 6.2.4对象的存储持续时间

  

标识符使用外部或内部链接声明的对象,或存储类说明符static的对象具有静态存储持续时间。对于这样的对象,存储是保留的,其存储值仅在程序启动之前初始化一次。对象存在,具有常量地址,并在整个程序的执行过程中保留其最后存储的值。 23)

6.7.8初始化部分:

  

如果未明确初始化静态存储持续时间的对象,则:

     

- 如果它有指针类型,则将其初始化为空指针;

     

- 如果它有算术类型,则初始化为(正或无符号)零;

     

- 如果是聚合,则根据这些规则初始化(递归)每个成员;

     

- 如果是联合,则根据这些规则初始化(递归)第一个命名成员。

因此a初始化为0

答案 1 :(得分:1)

(1)本地静态变量范围是本地的,所以都是不同的,(2)但是生命是直到你的程序没有终止。 (3)所有都具有初始值(默认值)0。 (4)来自静态段的记忆。