我可以在头文件中获取 static 关键字的示例吗?

Can I get examples for static keyword in header file?

static.h

static int y = 20;
static int& f(){
    static int x = 0;
    return x;
}

general.h

int x = 10;
int& g(){
    static int x = 0;
    return x;
}

outer.h

#include"general.h"
#include"static.h"

void h(){
    x = 20;//static
    y = 20;//non static

    f() = 20;//static
    g() = 20;//non static
}

main.cpp

#include<iostream>
#include"static.h"
#include"general.h"
#include"outer.h"

int main(){
    h();
    std::cout<<"static objects are independent in each file\n";
    std::cout<<"x : "<<x<<", f() : "<<f()<<std::endl;
    std::cout<<"non static objects are only one in every file.\n ";
    std::cout<<"y : "<<y<<", g() : "<<g()<<std::endl;
}

我想模拟 static 关键字如何改变代码行为。
但是,我不知道该怎么做...
我该怎么办?

................................................ .........
我拆分了我的代码。
static.h

static int x = 0;
static int& f(){
    static int k = 0;
    return k;
}
void call_static();

static.cpp

#include"static.h"

void call_static(){
    x = 10;
    f() = 10;
}

general.h

int y = 0;
int& g(){
    static int z = 0;
    return z;
}
void call_general();

general.cpp

#include"general.h"
void call_general(){
    y = 10;
    g() = 10;
}

静态代码编译的很好,但是非静态代码没有编译。

错误代码

/usr/bin/ld: /tmp/general-539e11.o: in function `g()':
general.cpp:(.text+0x0): multiple definition of `g()'; /tmp/main-5f12cd.o:main.cpp:(.text+0x0): first defined here
/usr/bin/ld: /tmp/general-539e11.o:(.bss+0x0): multiple definition of `y'; /tmp/main-5f12cd.o:(.bss+0x4): first defined here
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)

正常吗?

在您展示的示例中,只有一个 .cpp 文件。
.h 个文件实际上不算作“翻译单元”,只有 .c.cpp 个文件是翻译单元。
原因是 .h 文件被添加到使用 #include.
的程序中 #include 将指定文件直接复制粘贴到当前文件中,使其成为 1 个大文件。
如果您有多个 .c.cpp 文件(或两者的混合,也没关系),您将能够看到 static 关键字对 variable/function 可见度。

切记永远不要 #include .c.cpp 文件!
相反,您应该将它们单独添加到您的程序中。
如果您使用的是 Visual Studio(不是 VS Code),只需添加一个新的源文件即可自动将其添加到程序中,您无需在任何地方提及它。
如果您使用的是其他编译器,请将 .c.cpp 文件的名称添加到要编译的文件列表中。

我建议阅读有关翻译单位的内容。
您可以在 https://en.wikipedia.org/wiki/Translation_unit_(programming) and What is a "translation unit" in C++? 上执行此操作,但我也强烈建议您仅在 google 上查找“c ​​和 c++ 翻译单元”并大致了解它们。

祝您编码愉快!