2011-05-16 37 views

回答

4

一個define是一個簡單的文本替換。 A const是隻讀存儲器。例如,如果它是一個定義,則不能說&GOKU

編輯

我忘了類型檢查和範圍。使用const有時比使用define好,因爲如果涉及操作中的常量,編譯器可以檢查類型。另外const服從範圍,所以它不會污染你的名字空間。

+0

我可以使用一個變量稱爲GOKU,如果我把它作爲#define? – Saad 2011-05-16 06:37:20

+0

@Saad可能不是。而不是'int GOKU',你可能會得到'int 9111'。 – cnicutar 2011-05-16 06:39:03

3

最明顯的區別

#define GOKU 9111 

是,#定義由預處理器處理,而常數是由編譯器處理。它們都不是在運行時定義的。當使用#define時,文本GOKU將在您的源代碼中用9111替換,之後編譯器將完成其工作。

2

預處理器常量僅在編譯之前就已存在。事實上,它們都是在預處理過程中解決的,並且(如果您想),您只能執行預處理並查看結果。

常變量,而另一方面,留在編譯的程序,因此可以在連接階段找到了。例如,您可以在另一個文件中定義「extern int const GOKU」,然後將它與第一個文件鏈接在一起訪問GOKU。

請注意,如果你嘗試過包括常量變量文件,它可能導致錯誤,如「符號GOKU定義multiplie倍」。

在可見性方面也存在差異。雖然常量變量遵循嵌套命名空間的規則(即例如:如果它是全局的,它將在文件中隨處可見,但它可以在任何代碼塊中重新定義),預處理常量可以從它所在的行可見被定義爲未定義的行(或文件結尾)。當然,您可以取消定義(使用#undef)或重新定義(使用另一個#定義)它。

還有的代碼是如何編制的問題。使用第一個GOKU會導致代碼更快一些,指令中會生成正弦數字符號。使用第二個GOKU會導致代碼慢一點,因爲將間接指向變量放置在數據段中的位置。

這就是我可以立即召回。

+0

速度是一樣的。自己檢查裝配。 (另外,這是一個C問題,所以沒有'::'運算符。) – 2011-05-16 06:46:25

+0

我明白了。會做。 – Srv19 2011-05-16 06:53:23