2011-03-22 171 views
0

我在頭文件中定義了以下方法C函數不返回值?

unsigned char test(void); 

實現:

unsigned char test() 
{ 
    unsigned char value = 0xFF; 
    return value;  
} 

當我這樣稱呼它:返回

unsigned char temp; 
temp = test(); 

沒有什麼???我用斷點介入它。最後,變量值的值爲0xFF,但永遠不會返回到臨時值?

我不習慣普通的老C ......只有C++,在聲明方法時可能會有某種細微的差別。

任何幫助將不勝感激!

+0

你怎麼知道它沒有返回到'temp'?你的意思是說,當你打印'temp'到控制檯,它的值不是'0x49'?它有什麼價值? – 2011-03-22 21:40:12

+0

這是非常不清楚你的意思是「永遠不會回到臨時」。請解釋確切的問題是什麼。 – julkiewicz 2011-03-22 21:40:46

+3

您提供的代碼將返回值。請你可以發佈真實的代碼,顯示問題的代碼。 – 2011-03-22 21:40:59

回答

2

確定它的調試器沒有用戶錯誤? 大多數調試器在實際執行任務之前不會顯示變量「temp」的值,直到下一行代碼。

+0

你好,正如上面在評論中所述,我正在通過代碼行。我不相信這是一個IDE錯誤,因爲我總是成功顯示char值。 – Dave 2011-03-22 21:57:18

+0

說真的,不要相信 - 只是測試它。放置一些依賴'temp'的值的代碼,看看行爲是否合適。禁用優化也可以幫助調試器。 – julkiewicz 2011-03-22 22:00:46

+0

奇怪。出於好奇,你在使用什麼編譯器? 我試過每個我能想到的編譯器標誌,我在打印時得到一個臨時值。 – MarcB 2011-03-22 22:04:27

2

如果啓用優化,temp可以保存在寄存器中,有時調試器在查找和顯示這些值時會遇到問題。實際上,如果你不在任何地方使用它,編譯器可以很好地丟棄返回值。確保您的代碼在進行調試時沒有進行任何優化編譯。

或者,使用男士已知的最早的方法進行調試:printf。 :)

6

我想你只是看到一個聰明的編譯器。如果您的變量在分配後從未被使用,那麼它只是被優化了。不過,該功能仍然被稱爲可能的副作用。

如果您將變量更改爲全局變量,編譯器無法知道您不會使用它,因此它會執行賦值操作。

我想如果你在作業後加上了printf或者聲明瞭tmp變量volatile,你也會在調試器中觀察到這個任務。

0

它的函數調用已被編譯器優化掉了,編譯器注意到你對temp沒有任何作用,並且你的函數調用沒有副作用,所以它優化了它。

嘗試在做0123'之後再添加一個printf,編譯器將不再執行相同的優化。