2012-11-01 161 views
30

可能重複:
Const vs Static Conststatic const和const有什麼區別?

是什麼static constconst之間的區別? 例如:

static const int a=5; 
const int i=5; 

它們之間有什麼區別嗎? 你什麼時候使用一個?

+0

@EtiennedeMartel「靜態是默認行爲」當然不是。無論給你什麼想法? –

+2

相關:http://stackoverflow.com/questions/6381088/const-vs-static-const – halex

+2

投票重新開放。 「重複」是問一個完全不同的問題,具體到內存使用情況。這個問題提出了一個關於差異的更一般的問題。 – rmaddy

回答

25

區別在於聯動。

// At file scope 
static const int a=5; // internal linkage 
const int i=5;   // external linkage 

如果i對象沒有定義它的轉換單元之外使用,你應該用static符聲明。

這使得編譯器能夠(可能)執行進一步優化並通知讀者該對象不在其翻譯單元之外使用。

+3

+1如果你還可以添加它的含義,如果這些聲明是在一個函數內,那將會很棒。 – Praetorian

+0

你確定'const int i = 5;'有外部連接嗎?在C++中它不... –

+4

@KerrekSB在文件範圍,是的。 *(C99,6.2.2p5)「如果對象的標識符的聲明具有文件範圍並且沒有存儲類說明符,則其鏈接是外部的。」* – ouah

40

static決定函數外的可見性或內部的變量生命期。所以它與const本身無關。

const意味着你沒有改變初始化後的值。

函數內部的靜態意味着變量將在函數結束之前和之後存在。

函數外部的靜態意味着標記爲靜態的符號範圍僅限於該.c文件,並且無法在其外部看到。

技術上(如果你想查看這個),static是一個存儲說明符,const是一個類型限定符。

+0

簡單的解釋謝謝! – Alec

0

這取決於這些定義是否在函數內部。 以外的答案函數由上面的ouah給出。 內部函數效果是不同的,通過下面的例子說明:

#include <stdlib.h> 

void my_function() { 
    const int foo = rand();   // Perfectly OK! 
    static const int bar = rand(); // Compile time error. 
} 

如果你想有一個局部變量是「真常,」你必須定義它不僅僅是「常量」,而是「靜常量」。

+0

它爲我完美編譯......但我知道在這種情況下有一個靜態常量變量是愚蠢的。 – DrumM

相關問題