2011-09-28 63 views
0

一個全局靜態INT這裏是我的代碼:遞增主

文件DataTypes.h

static int count=0; 

文件TreeOps.h

#include"DataTypes.h" 
void printTree(Tree* ptr) 

文件TreeOps.c

#include"TreeOps.h" 
void printTree(pointer){ 
count++; // incrementing the count; 
printf("%d",counter); 
} 

文件TreeMain.c

#include"TreeOps.h" 
printTree(pointer); // all the necessary declarations are done. 
printf("%d",count); 

如果在printTree函數中,printf給出count = 1;而在主要功能它給了我0.1

爲什麼?

回答

4

靜態變量意味着:每一個C文件有其自身的變量實例。在h文件刪除靜態清晰度:

 
extern int count; 

,這增加的C文件之一:

 
int count = 0; 

的extern的意思是:這是向前聲明。通過定義一個變量爲extern,你告訴編譯器count有int類型,並且這個變量是在某處創建的。實際上,這個變量是在一個且只有一個c文件中創建的。您可以在包含DataTypes.h的任何c文件中使用它。在創建此變量的文件中,編譯器使用它。在所有其他文件中,此變量成爲外部引用,稍後由鏈接器解析。

+0

爲什麼我需要在.c文件中寫入int count = 0 ..不會讓它在第一個位置出現讓它可用於其他所有文件? 也是我的.c文件應該定義在? main.c或TreeOps.c? – Kraken

+0

答案已編輯。 –

+0

所以我應該刪除靜態定義從DataTypes.h和位置,我寫'extern int count;' 現在在我的main.c我寫 #include「DataTypes.h」 int count = 0; void main() { printTree(pointer); printf(「count」); } 它會給我正確的答案..因爲它不是? 它仍然不增加計數? – Kraken

1

首先,限定在頭文件數據或功能是在C程序設計一種不好的做法。在DataTypes.h你不只是聲明count變量,但定義它。

實際上會發生什麼情況是,count在每個翻譯單元單獨定義和你鏈接後出現了兩個變數。鏈接器不會合並它們,因爲它們被標記爲static,這意味着它們應該位於翻譯單元的本地。

如果你想成爲TreeOps.cTreeMain.c翻譯單元之間共享的count變量,你必須在頭文件僅聲明它使用extern

​​

,並全局把它定義爲int countTreeOps.cTreeMain.c。在這種情況下

0

你不必在你的程序中的「全局靜態INT」。聲明爲static的實體不可能是「全局」的。聲明static的全部要點是使其本地到特定的翻譯單元。這正是你所做的:你已經在兩個不同的翻譯單元中聲明瞭兩個完全獨立的靜態變量。每個變量都位於其自己的翻譯單元中。然後,您正在修改其中一個變量並打印另一個變量。難怪其他人不變。

在這種情況下,你必須決定它到底是你想要的。您可以將變量作爲全局變量或靜態變量,但不能同時存在。 「全局變量」和「靜態變量」是相互排斥的概念。那麼,你想要什麼:全局還是靜態?

+0

如果我想要做這樣的事情,該怎麼辦。我想有一個全局類型的變量(可用於所有文件和函數),如果我修改任何文件中的某個函數,它會在其他文件中受到影響? – Kraken

+0

@Karan:在一個頭文件中聲明該變量爲'extern int count',然後將該頭文件包含在每個源文件中,並且在其中一個源文件中全局定義了「int count」。鏈接器將完成它的工作。 –

+0

@Karan:在這種情況下,您需要一個* global *變量。其他答案已經爲您提供了適當的一組聲明。 – AnT