无法理解静态行为

8 浏览
0 Comments

无法理解静态行为

我在项目中写了以下内容:

// 在文件 t.h 中
#ifndef __t_h__
#define __t_h__
static int abc;
#endif

--

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

- -

// 在 test.c 中
#include 
#include "t.h"
void test()
{
    abc++;
    printf("%d \n", abc);
}

当我运行项目时,发现abc的输出为1和1

但是当我将t.h中的abc改为int abc时,abc的输出为1和2

为什么当控制流到达test.c文件时,static不能保留值。

如果它不保留值,为什么不提供错误提示,因为static变量不能在文件之间共享

0
0 Comments

当在头文件中声明一个静态变量时,每个包含该头文件的翻译单元中都会创建一个静态变量的副本。因此,你的程序中涉及的每个翻译单元都有自己的abc副本,这就是观察到的行为。这个行为不是你期望的,但它是良好定义的。

这是什么问题的解决方法呢?

不行,它们不能!这正是将它们定义为static的目的。

静态变量具有内部链接。它们的作用域限制在它们被声明的翻译单元内。它们不能在翻译单元之外被访问。如果你想在不同的翻译单元之间共享相同的变量,你应该去掉static并使用extern,它给变量赋予了外部链接,从而在不同的翻译单元中可见。

好文章:

如何使用extern在源文件之间共享变量?

你不能访问外部静态变量;它们的符号在链接时不会被导出。

:不存在所谓的外部静态变量。只能是extern变量或静态变量,不能同时使用。

可能无法声明/使用外部静态变量,原因如我所述(它们是不可访问的,因此语言规范禁止了它),但从概念上讲,该语句没有问题。这样的变量是不同于你所引用/使用的模块中的静态变量。

:我不明白这个观点。静态具有内部链接,extern具有外部链接,所以明显地,一个static extern变量是没有意义的。而且出于同样的原因,语言规范禁止了它。

0
0 Comments

问题的原因是,由于在main.c和test.c文件中都使用了关键字static声明了一个名为abc的变量,导致两个变量abc是各自独立的,不能互相访问。

解决方法是,通过修改t.h文件和main.c文件,将abc变量声明为外部变量,即使用关键字extern声明。这样,test.c文件就能知道在项目中的其他地方存在一个名为abc的整数变量,并且在链接时能够找到它。

以下是修改后的代码:

t.h文件:

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

main.c文件:

#include 
#include "t.h"
int abc;
int main()
{
    abc++;
    printf("%d \n", abc);
    test();
}

通过这样的修改,程序中只有一个整数变量abc,它位于main.c文件中,但test.c文件知道它的存在是因为extern int abc告诉test.c在项目的其他地方有一个名为abc的整数变量,链接时能够找到它。这样,两个文件就可以互相访问变量abc了。

0
0 Comments

在这段内容中,提到了static变量具有内部链接性,这意味着每个翻译单元都有自己的副本。因此,在程序中包含t.h的每个.cpp文件都有自己的静态变量副本,这意味着内存中有两个对象。可以尝试打印它们的地址来确认这一点,因为它们的地址将不同。

这就是问题的原因:如果在一个.cpp文件中更改了对象,它不会反映在另一个.cpp文件中,因为另一个.cpp文件中的对象是一个不同的对象。为什么它会改变呢?

但是,当将它改为int abc(即不要使其成为static),那么每个翻译单元都有相同的对象。如果在一个文件中更改它,它将在另一个文件中也反映出来,如预期的那样。

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

“共享变量”是什么意思?在什么之间共享?静态对象可以在同一翻译单元中的两个函数之间共享,但不能在两个翻译单元之间共享。

extern intstatic int之间存在巨大的区别。一个是可共享的,一个不是。

可以更详细地解释一下吗?

static int a声明了一个具有内部链接性的变量,而extern int a声明了一个具有外部链接性的变量。在这个论坛上搜索这些术语(内部链接性和外部链接性),你会得到成百上千个主题。

这是你所需要的:What is external linkage and internal linkage in C++ ... and What are extern variables in C?

0