无法理解静态行为
无法理解静态行为
我在项目中写了以下内容:
// 在文件 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变量不能在文件之间共享
?
当在头文件中声明一个静态变量时,每个包含该头文件的翻译单元中都会创建一个静态变量的副本。因此,你的程序中涉及的每个翻译单元都有自己的abc
副本,这就是观察到的行为。这个行为不是你期望的,但它是良好定义的。
这是什么问题的解决方法呢?
不行,它们不能!这正是将它们定义为static
的目的。
静态变量具有内部链接。它们的作用域限制在它们被声明的翻译单元内。它们不能在翻译单元之外被访问。如果你想在不同的翻译单元之间共享相同的变量,你应该去掉static
并使用extern
,它给变量赋予了外部链接,从而在不同的翻译单元中可见。
好文章:
你不能访问外部静态变量;它们的符号在链接时不会被导出。
:不存在所谓的外部静态变量。只能是extern变量或静态变量,不能同时使用。
可能无法声明/使用外部静态变量,原因如我所述(它们是不可访问的,因此语言规范禁止了它),但从概念上讲,该语句没有问题。这样的变量是不同于你所引用/使用的模块中的静态变量。
:我不明白这个观点。静态具有内部链接,extern具有外部链接,所以明显地,一个static extern
变量是没有意义的。而且出于同样的原因,语言规范禁止了它。
问题的原因是,由于在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了。
在这段内容中,提到了static
变量具有内部链接性,这意味着每个翻译单元都有自己的副本。因此,在程序中包含t.h
的每个.cpp
文件都有自己的静态变量副本,这意味着内存中有两个对象。可以尝试打印它们的地址来确认这一点,因为它们的地址将不同。
这就是问题的原因:如果在一个.cpp
文件中更改了对象,它不会反映在另一个.cpp
文件中,因为另一个.cpp
文件中的对象是一个不同的对象。为什么它会改变呢?
但是,当将它改为int abc
(即不要使其成为static
),那么每个翻译单元都有相同的对象。如果在一个文件中更改它,它将在另一个文件中也反映出来,如预期的那样。
至于共享,是的,static
对象可以在同一翻译单元中的两个函数之间共享,但不能在两个翻译单元之间共享。
“共享变量”是什么意思?在什么之间共享?静态对象可以在同一翻译单元中的两个函数之间共享,但不能在两个翻译单元之间共享。
extern int
和static int
之间存在巨大的区别。一个是可共享的,一个不是。
可以更详细地解释一下吗?
static int a
声明了一个具有内部链接性的变量,而extern int a
声明了一个具有外部链接性的变量。在这个论坛上搜索这些术语(内部链接性和外部链接性),你会得到成百上千个主题。
这是你所需要的:What is external linkage and internal linkage in C++ ... and What are extern variables in C?