静态局部变量如何跨翻译单元共享?链接性规则困惑求解
关于C++中
static链接性与静态局部变量的疑问 我原本认为static指定内部链接性,比如静态成员函数在不同翻译单元中各有一份副本,链接器会选择其中一份纳入可执行文件。但实际测试中发现,当两个翻译单元包含同一个头文件,其中类的静态成员函数内的静态局部变量,在被不同翻译单元调用时会被共享(比如示例代码里的s_nCount最终会变成2),这和我对内部链接性的认知产生了冲突。
示例代码
Shared.h
#pragma once class CShared { public: static inline void Foo() { static int s_nCount = 0; ++s_nCount; } private: CShared(){} ~CShared(){} };
A.h
#pragma once class A { public: A(){} ~A(){} void Foo(); };
A.cpp
#include "A.h" #include "Shared.h" void A::Foo() { CShared::Foo(); }
B.h
#pragma once class B { public: B(){} ~B(){} void Foo(); };
B.cpp
#include "B.h" #include "Shared.h" void B::Foo() { CShared::Foo(); }
main.cpp
#include <iostream> #include "A.h" #include "B.h" int main() { A a; B b; a.Foo(); b.Foo(); return 0; }
核心疑问
- 静态局部变量是否不具备内部链接性?
- 跨翻译单元共享的特性和内部链接性是否矛盾?
整理的不同观点
更新1
| static 实体 | 链接性 |
|---|---|
CShared::Foo | 非内部链接性 |
s_nCount | 外部链接性或无链接性 |
Some programmer dude 观点
| static 实体 | 链接性 |
|---|---|
CShared::Foo | 无链接性 |
s_nCount | 无链接性 |
我的初步理解
CShared::Foo属于无链接性 - 局部类及其成员函数范畴,s_nCount属于**无链接性 - 未显式声明extern的变量(无论是否带static修饰)**范畴,希望得到明确结论。
更新2
| static 实体 | 链接性 |
|---|---|
CShared::Foo | 外部链接性 |
s_nCount | 无链接性 |
相关引用
"static - 静态或线程存储期及内部链接性(或非匿名命名空间中静态类成员的外部链接性)。"
"静态类成员具有外部链接性。类成员函数具有外部链接性。"
额外需求
希望明确static在以下场景中的具体含义:
- 全局变量前的
static - 局部变量前的
static
内容的提问来源于stack exchange,提问作者YoonSeok OH
相关产品推荐
相关产品推荐

