編譯研究(3) 同名變數定義

2021-06-15 22:16:34 字數 1068 閱讀 8330

今天在處理變數時發現了乙個問題:對於不同函式中定義的同名變數,在源**中,我原來只是簡單根據變數名稱進行區分,由於作用範圍不同,所在符號表不同,因為雖然同名但互不影響;但這樣的方法用在中間**中就會出問題。例如中間**使用同乙個列表處理所有變數,並只是簡單根據變數名稱來在這個列表中索引變數的值,因此同名變數會重疊,並相互影響。

為此參考了vc生成的彙編**,發現它對變數的引用都是把變數名稱和基址指標聯合起來表識乙個變數,例如有以下c/++**:

1;

則它的彙編**會是這樣的:

4可見它是利用變數名稱和基址指標指向的實時值聯合起來引用乙個變數,如此一來就能夠很好解決變數名稱重疊的問題。

鑑於我的虛擬機器種記憶體模型還很簡單,不能用這麼複雜的暫存器來表示變數,因此我暫時根據變數所在函式的序號和變數名稱來引用變數:

; 則中間**是:

1,   1

表示這裡引用的是1號函式中定義的n。 

另外,如果考慮在不同巢狀層次定義同名變數,方法也類似。如下**所示:

$不同巢狀作用域的同名變數定義

_proc test() :

int n

=0 ;

if(n

==0)

int n=1

;

loop(

1)

int n =21

;

endl

n =n

+1;

endi

n =1

;

_endp

在生成**時,只要根據作用域來加以區分即可。例如函式序號為0,函式

入口處作用域編號為0,第乙個巢狀作用域編號加1,依次遞增。上述**

中,第乙個n在中間**中表示為 n?0?0 ,第二個為n?0?1 ,第三個為

n?0?2 等等,如此類推。

深入解析 c 中定義同名的靜態變數

最近通過幫朋友解答c 的一道筆試題,學到了不少東西,在此記錄下。題目如下 看到這道題,大部分人都能意識到這道題考的是 static 關鍵字的相關知識,static 關鍵字定義的變數只會初始化一次,並且值會在作用域內共享。到此大部分分人直接選d選項就接啥這道題了。但是細心的人可能會問,呼叫三次fun ...

sublimtext3 自定義編譯環境

sublime text是乙個非常神奇到編輯器,對於我這種小白來說,感覺比vim好用,但是如果用sublime自帶到編譯環境到話,是沒法向程式彙總輸入資料的,所以要自己新建編譯命令 file regex 0 9 0 9 working dir selector source.c,source.c s...

GCC編譯器變數重複定義的問題

在製作tft驅動時將font檔案放在檔案裡,因為gcc編譯器和mdk編譯器鏈結上的區別,會在編譯font.h時編譯一次字元變數,在其他.c或者.件裡呼叫的時候還會再編譯一次,所以會造成重複定義的問題。因為第一次使用gcc編譯器,所以當時想破腦袋也沒找到重複定義的地方,後來查csdn才發現gcc鏈結時...