这是我的代码:
文件DataTypes.h
static int count=0;
文件TreeOps.h
#include"DataTypes.h"
void printTree(Tree* ptr)
File TreeOps.c
#include"TreeOps.h"
void printTree(pointer){
count++; // incrementing the count;
printf("%d",counter);
}
File TreeMain.c
#include"TreeOps.h"
printTree(pointer); // all the necessary declarations are done.
printf("%d",count);
如果在printTree函数中printf
给出count = 1;而在main函数中它给了我0。
为什么?
答案 0 :(得分:4)
此上下文中的静态变量意味着:每个c文件都有自己的变量实例。删除h文件中的静态定义:
extern int count;
并将其添加到c文件之一:
int count = 0;
extern表示:这是前向声明。通过将变量定义为extern,可以告诉编译器count具有int类型,并且在某处创建此变量。实际上,此变量是在一个且仅一个c文件中创建的。您可以在包含DataTypes.h的任何c文件中使用它。在创建此变量的文件中,编译器使用它。在所有其他文件中,此变量成为外部引用,稍后将由链接器解析。
答案 1 :(得分:1)
首先,在头文件中定义数据或函数是C编程中的一个不好的做法。在DataTypes.h
中,您不仅声明 count
变量,而且定义它。
实际发生的是count
在每个翻译单元中单独定义,并且在链接后最终会得到两个变量。链接器不会合并它们,因为它们标记为static
,这意味着它们应该是翻译单元的本地。
如果您希望在count
和TreeOps.c
翻译单元之间共享TreeMain.c
变量,则必须在头文件中使用extern
,该文件仅声明它:< / p>
extern int count;
然后在int count
或TreeOps.c
中将其全局定义为TreeMain.c
。
答案 2 :(得分:0)
您的程序中没有“global static int”。声明为static
的实体不可能是“全局的”。声明static
内容的重点是将 local 设为特定的翻译单元。这正是您所做的:您已在两个不同的翻译单元中声明了两个完全独立的静态变量。每个变量都是其自己的翻译单元的本地变量。然后,您正在修改其中一个变量并打印另一个变量。难怪对方保持不变。
在这种情况下,你必须决定你想要的是什么。您可以将变量作为全局变量或静态变量,但不能同时使用。 “全局变量”和“静态变量”是互斥的概念。那么,你想要的是什么:全局还是静态?