C++函数内static修饰的局部变量多次调用为何无重定义错误
你给出的代码如下:
int func() { static int number = 1; return ++number; } int main() { int i = func(); printf("i is %d", i); //This gives 2 i = func(); printf("i is %d", i); //This gives 3 return 0; }
不会产生重定义错误的核心原因
- 首先要明确:重定义属于编译期错误,编译器在处理代码时,只会为这个func内部的static局部变量
number生成唯一的定义,分配静态存储区的唯一地址,整个程序中不存在第二个number的定义,编译阶段就不可能触发重定义报错。 - 你误解了静态局部变量的初始化逻辑:
static int number = 1;这行代码的初始化操作仅会在第一次调用func函数时执行一次,后续调用func时会直接跳过初始化逻辑,复用已经存在的number变量的当前值,运行阶段根本不会重复执行定义、初始化操作,自然不会出现冲突。 - 静态局部变量的存储位置在全局静态存储区,生命周期和整个程序的运行周期一致,但作用域仅局限在func函数内部,和普通全局变量的区别只是作用域被限制,不存在重复定义的问题。
内容的提问来源于stack exchange,提问作者Gaaaavin
相关产品推荐
相关产品推荐

