2012-11-01 120 views
2

面試問題很常問。但是,我不清楚我在不同網站上找到的解釋。因爲,當我試圖執行此代碼時,它顯示_AX未聲明的錯誤。psuedo全局變量c

main() 
    { 
    int i; 
    i = abc(); 
    printf("%d",i); 
    } 
    abc() 
    { 
    _AX = 1000; 
    } 

人說_AX僞全局變量,這就是爲什麼它顯示輸出。

* 注: - 它顯示錯誤_AX未申報的,但是當我聲明的變量,那麼就說明一些垃圾值*

+1

請注意,任何以下劃線後跟大寫字母或兩個下劃線開頭的標識符都被認爲是由編譯器/實現保留的。由於'_AX'符合該模式,因此您馬上知道這是某種特定於編譯器的功能。 –

+0

我認爲它是C的一些dos擴展的一部分。不要認爲它是C標準的一部分。你正在使用哪種編譯器? – CCoder

+0

visual studio編譯器 – Ravi

回答

10

這頻繁出現?這完全是無稽之談。推測_AX是一些特定於編譯器的符號,用於訪問「ax」寄存器,該寄存器在x86上用於返回值。但是沒有理由相信寄存器中的值不應該在賦值和函數返回之間被破壞。這個程序調用未定義的行爲。如果有人提供你的工作,希望你知道這種無效的做法,運行。快速。他們不勝任。

+0

'_AX'是一個Borland C擴展,所以除非你使用Borland編譯器,否則它將不會被定義。看到http://stackoverflow.com/questions/10891566/pseudo-registers-in-msvc – shf301

+3

更多的紅旗:他們使用老的不好的做法,如隱式函數聲明和隱式'int'。 –

+0

請注意,這種類型的擴展 - 直接訪問寄存器並由編譯器保證寄存器將它們的值保存在C語句之間 - 基本上阻止了編譯器進行任何**優化。編譯器將C視爲彙編語言的最小結構包裝器,這意味着代碼生成將非常糟糕。 –