討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 掌握Salesforce雲端管理秘訣 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
識別字 是不是只有開發者宣告的變數才有的
更改我的閱讀文章字型大小
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/14 下午 11:26:41
請問各位一下
是不是 變數的識別字, 只通用在開發者本身

假如編譯器自己宣告一個變數
那這個變數是不是只有地址沒有識別字?



因為識別字是為了方便開發者的開發
對嗎? 0.0
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/15 上午 05:17:42
>請問各位一下
>是不是 變數的識別字, 只通用在開發者本身

『識別字』是 identifier?

先詳細說明你對 identifier 的理解是什麼.


>假如編譯器自己宣告一個變數
>那這個變數是不是只有地址沒有識別字?

請舉出一個『編譯器自己宣告變數』的例子, 或是一個你懷疑『編譯器自己宣告變數』的例子!


>因為識別字是為了方便開發者的開發
>對嗎? 0.0

你到底想要知道什麼? 你問這問題的目的是什麼? 什麼東西導致你問這些問題? 為什麼你認為你有必要懂得這些?

作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/15 下午 12:07:39
..........

就單純想知道而已

因為我不太相信假如編譯器自己宣告一個變數
它會用識別字來辨識,
畢竟我們開發者使用識別字就是來取代位址,
但是底層我們的識別字都代表位址,  所以編譯器根本不需要用識別字

我是這樣認為啦...................
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/15 下午 08:45:52
identifier is a rule of programming language. please refer to http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf , p51 - identifer
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/16 下午 09:34:14
>就單純想知道而已
>
>因為我不太相信假如編譯器自己宣告一個變數

『假如編譯器自己宣告一個變數』的依據是什麼? 還是你有看到什麼程式片段讓你認為編譯器做了這件事? 或是你根本就是毫無根據亂想亂猜的!?

如果你的『假如』根本就不成立呢?

假設性的問題無從回答.


>它會用識別字來辨識,
>畢竟我們開發者使用識別字就是來取代位址,

誰告訴你識別字都代表位址的? 你有清楚識別字包括些什麼嗎?


>但是底層我們的識別字都代表位址,  所以編譯器根本不需要用識別字

『代表位址』不是編譯器不需要用識別字的原因, 更何況識別字並不都代表位址.



>我是這樣認為啦...................

程式語言不是哲學, 不能天馬行空.

作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/16 下午 10:16:50
for each programming language , it owns different or same definition of syntax. identifier is a part of programming language specification. in other words , it is a specific rule of corresponding programming language.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/16 下午 10:59:12
如果單從主題來看:『識別字 是不是只有開發者宣告的變數才有的』

答案是:不是.

但不能由此而導出『是編譯器自己宣告的』這個結論.

作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/17 上午 09:55:01
http://inspiregate.com/programming/other/471-compiler-1.html
a tutor that provides some articles about compiler design.
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/17 上午 11:59:00
>是不是 變數的識別字, 只通用在開發者本身
>假如編譯器自己宣告一個變數
>那這個變數是不是只有地址沒有識別字?
如果我沒理解錯的話,你是想知道編譯器和使用者程式變數名稱宣告衝突的問題。
編譯器石能會有自己使用的變數,但很少(有些stack有限的CPU會用變數來取代stack使用,那就會有產生很多變數名稱)
這些變數最後還是要經linker配置後才會有真正的地址,所以不會只有地址沒有名稱。
只要是global的奱數名稱就不能衝突(到了link階段,不會去辯識是編譯器或使用者程式的變數)。
但編譯器宣告的變數都會加一些prefix(如’_’)和特別的符號(像是'?'),使用者宣告的變數很少會跟它們衝突。
真的衝突編譯時也會有錯誤訊息,程式員就自己改一下衝突的名稱就可以了,沒什麼好擔心的。
除了變數名稱,編譯器也會產生很多程式地址名稱,同樣的這些名稱也不能和程式衝突。
也同樣的,編譯器會用特殊的字符來"儘量"避免和使用者的程式衝突。
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/17 下午 10:54:09
>如果我沒理解錯的話,你是想知道編譯器和使用者程式變數名稱宣告衝突的問題。
>編譯器石能會有自己使用的變數,但很少(有些stack有限的CPU會用變數來取代stack使用,那就會有產生很多變數名稱)
>這些變數最後還是要經linker配置後才會有真正的地址,所以不會只有地址沒有名稱。
>只要是global的奱數名稱就不能衝突(到了link階段,不會去辯識是編譯器或使用者程式的變數)。
>但編譯器宣告的變數都會加一些prefix(如’_’)和特別的符號(像是'?'),使用者宣告的變數很少會跟它們衝突。

上面指的應該是跟編譯器配套的函式庫裡使用的名字, 或語言標準規定的 reserved words. 不是編譯器自己產生的變數. 自動產生的名字如果不在語言標準規範內, 會讓程式碼變得不可攜.

因為 C 及 C++ 語言設計的理念, 編譯器不會在沒有需要的情況下加入多餘的資料 (如陣列長度) 或行為 (如自動初始化, 及 overflow 的偵測).

據我所知, C 語言唯一在程式裡看不到的但編譯器會自動加入的是字面字串裡的終結字元.

由於語言設計的需要, C++ 會自動加入的資料會比較多, 以下是最常見的:
  - 字面字串的終結字元,
  - 某些情況下自動產生的 class 成員,
  - 非-static 成員函式的 this 參數,
  - v-table (在有 virtual 成員函式下).

編譯器沒有也不需要產生額外的名字來參照這些自動產生的資料.


>真的衝突編譯時也會有錯誤訊息,程式員就自己改一下衝突的名稱就可以了,沒什麼好擔心的。
>除了變數名稱,編譯器也會產生很多程式地址名稱,同樣的這些名稱也不能和程式衝突。
>也同樣的,編譯器會用特殊的字符來'儘量'避免和使用者的程式衝突。

據我了解, 編譯器會自己產生名字的只有幾個地方:
  - C 及 C++ 的 decorated names (也叫 name mangling),
  - C++ anonymous namespace (也叫 unnamed namespace),
  - 編譯器根據需要自動產生的成員函式,

前兩個都是 implementation specific. 新的名字都是依據其它現有的資料 (檔案名字, 編譯時間, namespace 名字, class 名字, 參數類型) 推導出來的, 降低衝突的可能性.

作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1270 | 評價/貼文 1.22 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/18 下午 12:08:05

>請問各位一下
>是不是 變數的識別字, 只通用在開發者本身
>
>假如編譯器自己宣告一個變數
>那這個變數是不是只有地址沒有識別字?
>
>
>
>因為識別字是為了方便開發者的開發
>對嗎? 0.0

樓主的意思若是指為記憶體位址命名是不是程式員才須要,編譯器本身"若須要一個位址"來處理是不是不須要名稱。
這樣說似乎沒錯,只是編譯器本身會有須要一個位址的情況嗎?若沒有則所有的位址都是由程式員須要而創造出來,而這位址是不是一定有名稱則是另一層面的問題

int f(int i)
{
  return i + 5;
}

void main()
{
  cout << f(10) + 10 << endl;
}

f(10) + 10 須要有個地方來存放結果,應是樓主的疑問吧
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/18 下午 01:54:23
>編譯器本身"若須要一個位址"來處理是不是不須要名稱。
>這樣說似乎沒錯
這樣說是不對的,所有"絕對"位址都是到了連結(link)階段才配置的。
編譯階段需要的位址都要有個名稱(可以是某個segment名稱的相對位址)。
這樣linker才能正確的配置絕對地址。
若編譯階段需要的記憶體(位址)還是要有名稱的。

>只是編譯器本身會有須要一個位址的情況嗎?
會有,最常見的就是label。常見到的編譯器會產生海量的label。
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1270 | 評價/貼文 1.22 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/18 下午 02:20:16

>>編譯器本身'若須要一個位址'來處理是不是不須要名稱。
>>這樣說似乎沒錯
>這樣說是不對的,所有'絕對'位址都是到了連結(link)階段才配置的。
>編譯階段需要的位址都要有個名稱(可以是某個segment名稱的相對位址)。
>這樣linker才能正確的配置絕對地址。
>若編譯階段需要的記憶體(位址)還是要有名稱的。

對於何時對變數配置出位址不是重點吧,重點是會配置出不須名稱的位址嗎,
或者說編譯會配置出不是程式所須之外的記憶體空間嗎


>>只是編譯器本身會有須要一個位址的情況嗎?
>會有,最常見的就是label。常見到的編譯器會產生海量的label。

label 是指?
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/18 下午 02:26:46
>上面指的應該是跟編譯器配套的函式庫裡使用的名字, 或語言標準規定的 reserved words. 不是編譯器自己產生的變數.
如果是reserved words 當然程式裡是不能用的(不然就不叫reserved word了),這應該沒啥好討論的。
如果是函式庫裡使用的名字,函式庫是和使用者程式連結在一塊的,名稱被函式庫用了,程式就不能再用,好像沒沒啥好討論...

>自動產生的名字如果不在語言標準規範內, 會讓程式碼變得不可攜.
對!但"可攜性"是個理想,事實上做不到100%可攜的。
尢其是CPU千奇百怪,編譯器要用到某些CPU的特性就會增加或改變C標準規範。
但這些編譯器都會附有和標準C/C++差異的列表。

>因為 C 及 C++ 語言設計的理念, 編譯器不會在沒有需要的情況下加入多餘的資料 (如陣列長度) 或行為
>(如自動初始化, 及 overflow 的偵測).
我還是要說理念只是個理想,現實就會有設計語言標準時想像不到的需求。
例如8051的stack很有限,所以區域變數和引數是無法配置在stack裡面。
必需配置在stack之外的空間裡,這個空間就必需命名(連結時需要)。
由於引數會被其它不同程式檔的函式所呼叫,所以這個空間名稱還必需是全域性的。
舉個例,下面這個程式:
int AddFun(int i, j){return i+j; }

int SubFun(int i,int j){return i-j;}

int compFun(int i, int j, int k){return SubFun(AddFun(i,j),k);}

main()
{
int ResultAdd, ResultSub, ResultComp;
ResultAdd= AddFun(1,2);
ResultSub= SubFun(10,7);
ResultComp= compFun(5,4,3);
}
在Keil C51 編譯連結完成後,查看其Map:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SEGMENT XDATA_GROUP
  +--> CALLED SEGMENT START LENGTH
----------------------------------------------
?C_C51STARTUP ----- -----


?PR?MAIN?SAMPLE 0000H 0006H

?PR?ADDFUN?SAMPLE 000CH 0004H

?PR?SUBFUN?SAMPLE 000CH 0004H

?PR?COMPFUN?SAMPLE 0006H 0006H
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

可以看到後面四行(?PR開頭)的名稱就是各函式配置引數(含區域變數)的名稱和位置。
前面回文我也提到了,編譯器會用特殊字符來避免和使用者程式的名稱衝突。
所以Keil C51使用了'?'字符,這是程式員為變數命名時不能使用到的字符。
但我見過使用'_'的,這是可能和程員用的名稱可能衝突的,但其命名都會有一長串的規則,衝突機率很小很小。
(大概只有故意才會衝突)
就算真的衝突,改一下名稱也不是什麼大礙才對。

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/18 下午 02:51:09
>對於何時對變數配置出位址不是重點吧,
當然是重點,若編譯階段就可配置絕對位址,編譯器是可以不需為需要的位址命名而直接使用地址。

>重點是會配置出不須名稱的位址嗎,
>或者說編譯會配置出不是程式所須之外的記憶體空間嗎
會配置當然是程式需要用到的空間。
重點是這空間不一定程式員"主動"要求的。
請看我回R大的回文,有例子。
>label 是指?
底下程式片斷,'L?'頭的就是label。
它是最佳化時,把一些重覆的執行碼變一個函式供呼叫。(可以縮小程式確)
’C?’開頭的,是編譯器執行會用到的功能函式,它並不是程館的函式,所以也算是一種label。
C:0x41C4 E0 MOVX A,@DPTR
C:0x41C5 F8 MOV R0,A
C:0x41C6 A3 INC DPTR
C:0x41C7 126B3A LCALL L?0135(C:6B3A)
C:0x41CA FB MOV R3,A
C:0x41CB C3 CLR C
C:0x41CC 1203A4 LCALL C?ULCMP(C:03A4)
C:0x41CF 5021 JNC C:41F2
C:0x41D1 906C09 MOV DPTR,#0x6C09
C:0x41D4 E0 MOVX A,@DPTR

這在VC裡也是常見的手法。

作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/18 下午 11:10:52
>可以看到後面四行(?PR開頭)的名稱就是各函式配置引數(含區域變數)的名稱和位置。

那是 name mangling, 編譯器針對程式已有物件名字的轉換. 並不是一個新物件的新名字.


>前面回文我也提到了,編譯器會用特殊字符來避免和使用者程式的名稱衝突。
>所以Keil C51使用了'?'字符,這是程式員為變數命名時不能使用到的字符。
>但我見過使用'_'的,這是可能和程員用的名稱可能衝突的,但其命名都會有一長串的規則,衝突機率很小很小。
>(大概只有故意才會衝突)
>就算真的衝突,改一下名稱也不是什麼大礙才對。

也不可能會有衝突, 因為 name mangling 本來就是在原有的名字上做更改的.

[關於 Label]
在 code generation 時, 編譯器在產生 assembly 的時候無可避免的會用到 label 給 jump 或 loop 的 instructions. 但這個還是屬於 identifier 嗎?

Identifier 是原始碼裡面除關鍵字外的所有名字. 包括程式員定義的變數名字, 函式名字, 架構名字, 架構成員名字, enumenumerator 的名字, label, namespace 名字, 等等...

所以原題目問的 『識別字 是不是只有開發者宣告的變數才有的』, 答案當然是: 『不是』. 因為識別字不止變數, 而且也不限於開發者使用的名字, 所有在程式碼裡引用的頭檔, 裡面所有非關鍵字的名字都是識別字. 大多數的識別字都沒有位址.

編譯器會產生新的識別字嗎? 我認為是會的. C++ 編譯器要實現 unnamed namespace, 必須在編譯時產生一個 unique 的名字.

但編譯器會在編譯時, 在原有的程式碼上定義新的變數嗎? 什麼情況下需要?

作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1270 | 評價/貼文 1.22 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/19 下午 12:20:05
要討論識別字這範圍就太廣了,依樓主的意思,應只是指變數的名字

由兩個方向來看

1. 有變數名字編譯器就應會配置記憶體空間,也許最佳化的情況下會配置在暫存器,不過不管怎樣一定會有空間給這變數名宇,所以沒什麼好討論。

2. 由另一個方向的來看,編譯器自己配置出記憶體空間是不是有名字,這就比較有意思了

編譯器在什麼情況下會配置出記憶體空間?這配置出的記憶體空間為什要有名字?

第一個問題我所想到的可能性就臨時物件,比如

class MyInt
{
public:
  // Constructor
  MyInt(const int &i);
};

在某些情況下 int 會被隱性轉為 MyInt,而無端生出一個臨時物件的記憶體空間,但這可能會有爭議,比如這
不是程式員的意思?會有這臨時物件也應有引用它的地方,因此也應歸類為"有變數名字編譯器就應會配置記憶體空間"

所以我實在想不出編譯器會無端生出記憶體空間,就更別說是不是有名字了

依 coco 的說法,最佳化時會把一些重覆的執行碼變一個函式,若這是真的那算是編譯器自己會配置出記憶體空間,就算是好
了,那為什麼要有名字,依 coco 的說法,編譯階段無法決定記憶體位置,須由連結器來配置,但連結器須有待配置的符號
表,也就是編譯器須為這自己造出來的記憶體空間給個名字的原因。
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/20 下午 07:52:18
>那是 name mangling, 編譯器針對程式已有物件名字的轉換. 並不是一個新物件的新名字.
不是喔,原名子是指向程式區,新字是指向資料容器。


>[關於 Label]
>在 code generation 時, 編譯器在產生 assembly 的時候無可避免的會用到 label 給 jump 或 loop 的 instructions.
>但這個還是屬於 identifier 嗎?
是,但Label名稱還是獨有的,不能衝突。

>但編譯器會在編譯時, 在原有的程式碼上定義新的變數嗎? 什麼情況下需要?
我的例子看是喔。產生的名子是指向引數或區域變數容器。算是定義新的變數(物件)吧?
還有我提到的例子,函式預設是不能reentrant的,要reentrant除要特別對函式聲明外。
編譯器會配置一個 reentrant 函式專用的stack,然後配置一個reentrant stack的指標變數(類似stack暫存器功能)。
這個stack的指標變數是有名稱的,程式使用這個變數名稱就可以存取它。
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/21 上午 01:22:45
>不是喔,原名子是指向程式區,新字是指向資料容器。

如果你指的是 ?PR?MAIN?SAMPLE 那些都是程式區.

另外, name mangling 不限於函式, 也包括資料.


>>[關於 Label]
>>在 code generation 時, 編譯器在產生 assembly 的時候無可避免的會用到 label 給 jump 或 loop 的 instructions.
>>但這個還是屬於 identifier 嗎?
>是,但Label名稱還是獨有的,不能衝突。

我個人是認為 code generation 時產生的 label 不能算是 C 語言的 identifier. 因為觀點不同, 這個已沒有繼續討論下去的必要了.


>>但編譯器會在編譯時, 在原有的程式碼上定義新的變數嗎? 什麼情況下需要?
>我的例子看是喔。產生的名子是指向引數或區域變數容器。算是定義新的變數(物件)吧?

在編譯時, 編譯器會依目標平台產生不同區域, 並把資料分類放進不同的區域裡. 我也不認為這些區域的名字算是 C 語言的 identifier. 不過這個也沒有繼續爭論下去的必要.

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/21 下午 05:51:24
>如果你指的是 ?PR?MAIN?SAMPLE 那些都是程式區.
不是程式區。
?PR?MAIN?SAMPLE上面的title寫著SEGMENT XDATA_GROUP
XDATA 是8051的外部資料區。
?PR?MAIN?SAMPLE 後面的4和6各代表其xdata位置在4,總長度為6

>另外, name mangling 不限於函式, 也包括資料.
它也不算是"name mangling",因為是編譯器造造的容器和名字。
雖然main,sample就是程式檔名,函式名稱。
但名子不是經由修改程式裡某個變數而得。

>我個人是認為 code generation 時產生的 label 不能算是 C 語言的 identifier
我知道的。
我只是提一下,若要討論名稱衝突,label也是可能造成衝突。沒別的意思。

>在編譯時, 編譯器會依目標平台產生不同區域, 並把資料分類放進不同的區域裡.
> 我也不認為這些區域的名字算是 C 語言的 identifier
嗯,我就是還搞不清樓主要問的是變數名稱還是identifier的衝突問題...
前面我也提了,若是identifier,本來就沒啥好討論的。

 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.21875