2015-04-04 22 views
0

下面是我的代碼:編譯器將如何識別要讀取或更新哪個靜態變量?

#include <stdio.h> 
static int a; // this static variable scope is through out the file 
int main() 
{ 
    static int a; // this static variable scope is only in main() 
} 

現在,在這個程序編譯器會同時存儲變量數據段(BSS段要準確),所以如果兩個變量去同一個網段,編譯器將如何確定哪一個當用戶想要改變或閱讀其中任何一個時訪問。例如,如果用戶想要更改main()內部的變量a的值,編譯器將如何識別數據段內存中要更改哪個'a'。

+0

請記住,靜態意味着在這裏的每種情況下不同的東西。 – teppic 2015-04-04 16:05:38

回答

1

編譯器根據上下文知道你需要哪個靜態變量。一種區分實際變量的方法是通過搗毀這個名字。我想你的程序稍加修改的版本:

#include <stdio.h> 
static int a; // this static variable scope is through out the file 
int main() 
{ 
    static int a; // this static variable scope is only in main() 
    a=1; 
} 

void f() 
{ 
    a = 2; 
} 

如果運行通過源ELLCC demo page(不要忘記關掉優化!),你可以看一下編譯器爲你最喜歡的目標處理器。在彙編語言中,您可以看到編譯器創建了兩個變量:amain.a。 ELLCC編譯器基於clang/LLVM,但其他​​編譯器也會做類似的技巧。

查看編譯器的彙編輸出是回答這樣問題的好方法。

+0

編譯器輸出絕對是一個好主意,因爲C沒有處理這些事情的機制,而是留給實現。 – teppic 2015-04-04 15:58:16