局部静态变量
局部静态变量更像是全局静态变量的一个语法糖一样的存在,只不过编译器会自动添加检查语句来将它的初始化延迟到对应函数的第一次调用时。 需要注意的是,一般的函数局部变量是放在栈上的,而局部静态变量是在 BSS 里的。
extern inline
§7.1.2/4 C++03 / C++11 / C++14
A static local variable in an extern inline function always refers to the same object.
很明确,如果是 extern inline 里的 static 变量,那么就一定是同一个对象。所以问题中的「编译器进行展开的话就有了多份static变量」不成立。
至于非「extern」的 inline 函数,已经是 internal linkage / no linkage 的函数了,不同翻译单元里的版本之间也已经是不相干的东西,和题目中的疑问不冲突了。
p.s. 明明有标准文档,为什么要通过各种「实验」来猜测结论呢?即便做实验、看汇编,忙了半天最后发现结果与标准里的描述不符,那么其实也只能是某个实现出错了,而不是标准出错了呀。编译器也要按照基本法嘛。
函数中静态变量
你可能想有这样一种变量:可以对它进行局部定义和访问,但是在退出声明它的代码块以后,它还能继续存在。换句话说,需要在一个代码块作用于内声明一个变量,但是要让它有静态存储时间。static说明符为您提供了这样的方法。
静态变量作用域时所在的代码块,但具有静态存储时间。
如果在声明一个静态变量时候没有初始化,那么程序将对它进行初始化。静态变量默认的初始值始终是0,它被转换成适合于该变量的类型。请记住,对于自动变量来说并非如此。
如果没有初始化自动变量,那么它们包含的数据将是最近使用它们所占用内存的程序留下来的值。