You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

静态局部变量如何跨翻译单元共享?链接性规则困惑求解

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:43:11