2011-03-24 63 views
4

可能重複:我以前#define
C++ - enum vs. const vs. #define哪一個更好的做法:全局常量還是#define?

之前我曾經在我的主函數創建常數,並通過他們,他們需要的地方。我發現我經常通過它們,這很奇怪,尤其是數組大小。

最近我一直在使用#define,因爲我不必將常量傳遞給每個單獨的函數。

但現在我想到了,我也可以使用全局常量,但由於某種原因,我對它們有點猶豫。

哪一個更好的做法:全局常量或#define

一個側面的問題,也相關:從我的主要傳遞常量,因爲我描述了一個不好的做法?

+1

C++常見問題精簡版有一個很好的簡短摘要:http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.7 – Cubbi 2011-03-24 13:19:47

+3

這個問題不應該要求C和C++相同時間。這些與編譯時間常量有很大不同。 – 2011-03-24 13:49:55

回答

6

他們不完全相同的事情。 #define可讓您在編譯時影響代碼,而全局常量僅在運行時生效。

只看到#define只能給你帶來額外的麻煩,因爲你沒有檢查你的使用方法,你應該使用全局常量,當你需要的時候應該使用全局常量,而你必須使用#define。這樣會更安全和更具可讀性。

至於從main傳遞常量,這並非不合理,因爲它使被調用的函數更靈活地接受來自調用者的參數,而不是盲目地將其從全局拉出。當然,這個論證並沒有真正的預期會在你沒有太多收穫的程序的整個生命週期中改變。

+0

舉例來說,使用2D數組大小的全局常量是否可以接受?我猜測它是唯一的方法。 – 2011-03-24 13:34:14

+1

不正確:宏可以讓您在預處理時影響代碼,而全局常量可能會在編譯時影響代碼,並且可能只會在運行時執行。 – 2011-03-24 13:44:38

+0

@亞歷山大:技術上你是對的。我簡化了目的,例如編譯時間=當我點擊編譯按鈕時。 – Jon 2011-03-24 13:47:02

3

使用常量而不是#define是非常值得推薦的。 #define會在每個出現的地方愚蠢地取代令牌,並可能導致各種意想不到的後果。

傳遞值而不是使用全局值是一種很好的做法。它使代碼更加靈活和模塊化,並且更具可測試性。嘗試使用Google搜索「上面的參數」。

+0

取決於你使用全局變量的個人身份 - 例如,對於個人而言,我不會遇到具有全局常量「PI」的人的問題。 – 2011-03-24 13:20:29

+1

此外,常量可以在名稱空間或類中聲明,並且可以進行保護或保密。這與常量被鍵入(宏替換不是)的事實一起,使得更安全的代碼成爲可能。 – Juancho 2011-03-24 13:20:42

+1

效率方面,例如字符串常量只會在內存中駐留一次。來自#define的字符串將被替換多次到您的代碼中,並可能被替換爲您的可執行文件。 – Juancho 2011-03-24 13:22:43

1

常數比較好。兩者之間唯一的區別是常量是類型安全的。

+0

和常量不會遍歷所有命名空間規則。 – Pete 2011-03-24 13:35:33

0

您不應該使用像#常規參數那樣使用#define定義的值。定義主要用於防止編譯器在編譯時根據您的需要編譯代碼的某些部分(依賴於平臺的選擇,在編譯時進行優化)。

所以,如果你不使用定義爲這些原因避免和使用costant值。

2

您不應該使用#definesconst變量來表示數組大小;最好讓他們明確。

代替:

#define TYPICAL_ARRAY_SIZE 4711 

int fill_with_zeroes(char *array) 
{ 
    memset(array, 0, TYPICAL_ARRAY_SIZE); 
} 

int main(void) 
{ 
    char *za; 

    if((za = malloc(TYPICAL_ARRAY_SIZE)) != NULL) 
    { 
    fill_with_zeroes(za); 
    } 
} 

其使用(共享的,想象這是在一個共同的報頭或東西)#define通信的陣列大小,這是更好的,只是它傳遞給功能作爲一個真正的參數:

void fill_with_zeroes(char *array, size_t num_elements) 
{ 
    memset(array, 0, num_elements); /* sizeof (char) == 1. */ 
} 

然後,只需改變調用點:

int main(void) 
{ 
    const size_t array_size = 4711; 
    char *za; 

    if((za = malloc(array_size)) != NULL) 
    { 
    fill_with_zeroes(za, array_size); 
    } 
} 

這使得大小爲分配它的地方的本地大小,不需要被調用函數神奇地「知道」關於其參數通過其參數未傳達的內容。

如果數組是非動態分配的,我們可以做得更好,並刪除重複的符號大小甚至本地:

int main(void) 
{ 
    char array[42]; 
    fill_with_zeroes(array, sizeof array/sizeof *array); 
} 

在此,公知的sizeof x/sizeof *x表達式用於(在編譯時)計算數組中的元素數量。

相關問題