在main中增加全局静态int

时间:2011-09-28 18:26:28

标签: c static

这是我的代码:

文件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。

为什么?

3 个答案:

答案 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,这意味着它们应该是翻译单元的本地。

如果您希望在countTreeOps.c翻译单元之间共享TreeMain.c变量,则必须在头文件中使用extern,该文件仅声明它:< / p>

extern int count;

然后在int countTreeOps.c中将其全局定义为TreeMain.c

答案 2 :(得分:0)

您的程序中没有“global static int”。声明为static的实体不可能是“全局的”。声明static内容的重点是将 local 设为特定的翻译单元。这正是您所做的:您已在两个不同的翻译单元中声明了两个完全独立的静态变量。每个变量都是其自己的翻译单元的本地变量。然后,您正在修改其中一个变量并打印另一个变量。难怪对方保持不变。

在这种情况下,你必须决定你想要的是什么。您可以将变量作为全局变量或静态变量,但不能同时使用。 “全局变量”和“静态变量”是互斥的概念。那么,你想要的是什么:全局还是静态?