gpt4 book ai didi

c++ - 无法理解静态行为

转载 作者:太空狗 更新时间:2023-10-29 23:24:10 25 4
gpt4 key购买 nike

我写在

// In file t.h

#ifndef __t_h__
#define __t_h__
static int abc;
#endif

--

//In   main.c
#include <stdio.h>
#include "t.h"
int main()
{
abc++;printf("%d \n", abc);
test();
}

- -

//In test.c

#include <stdio.h>
#include "t.h"

void test()
{
abc++;
printf("%d \n", abc);
}

当我运行项目时,我发现 abc 的 output 是 1 和 1。但是当我在 t.h 中将其更改为 int abc 时。 abc = 1 和 2 的输出。当控件到达 test.c 文件时,为什么 static 不保留值。如果它不会保留,那么它为什么不提供错误,因为 static 变量不能在文件之间共享

最佳答案

static 变量具有内部链接,这意味着每个翻译单元都有自己的拷贝。

所以在你的程序中,每个包含 t.h.cpp 文件都有自己的静态变量拷贝,这反过来意味着,有两个 内存中的对象。您可以尝试打印他们的地址以确认这一点,因为它们会有所不同。

这使情况变得非常简单:如果您更改一个 .cpp 中的对象,它不会反射(reflect)在另一个 .cpp 文件中,因为对象在另一个 .cpp 文件是一个不同的对象。为什么要改变?

但是当您将其更改为 int abc(即不要将其设为 static)时,每个翻译单元都有相同对象。如果您在一个文件中更改它,它也会像预期的那样反射(reflect)在其他文件中。


至于共享,那么是的,static 对象可以在相同 翻译单元中的两个函数之间共享,但不能在两个翻译单元之间共享。

在这个网站上搜索翻译单元,你会得到很多关于它的话题。阅读它们,你就会完全理解它。

关于c++ - 无法理解静态行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11220116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com