2012-06-22 303 views
4

它使在C99任何區別,當一個在*.h)文件寫入const int x = 1;static const int x = 1;靜態常量

+0

我通常預先準備的靜態標識符的功能initializate一個變量,所以在第一次調用該功能可按後,任何其他調用不會再次重新初始化該變量。如果嘗試重新初始化變量,該變量就像一個常量。如果你的變量被聲明爲const,你永遠不能修改它。 –

回答

2

正如cdarke說的那樣,它有所不同。

const int x = 1;爲包含h文件的每個模塊創建一個鏈接器可見符號。
鏈接器應該停止並返回一個錯誤,因爲同一個符號有多個(可見的)定義。

static const int x = 1;爲每個模塊創建一個變量但不包含鏈接器符號,包括您​​的h文件。
鏈接器可以鏈接代碼,但是當您創建具有相同名稱的變量的多個實例時,它不確定您的代碼是否按預期工作。

Btw。在h文件中定義一個變量是一個絕對不好的主意,標準的方法是在c文件中定義它們,並且只在h文件中聲明它們(如果你真的需要訪問它們)。

當您只想在一個模塊中使用變量時,您可以使用static,並且它應該對所有其他人不可見。
const ...只有當你真的需要從另一個模塊訪問它,但恕我直言,你通常應該避免全球訪問變量。

myfile.c文件

#include "myFile.h" 
const int x=1; 
static const int y=2; 

myFile.h

extern const int x; 
+0

就我個人而言,我不認爲在頭文件中定義一個「static const int」是一個「絕對不好」的想法。它只是在C語言中通常毫無意義 - 幾乎所有的用途都是'#define'或枚舉類型,並且有些東西可以使用'#define'/enum,因爲你不能使用' static const int',比如一個struct的數組成員的大小。頭文件中的非常量對象可能難以證明:-) –

+0

@Steve - 是的,我特別想到非const對象 – jeb

3

是的。首先,我不建議你將這些定義放在一個頭文件中,但是如果你這樣做,則取決於包含頭文件的位置。無論如何,static使當前程序單元的本地變量。這裏有一個例子:

mp1.c:

#include <stdio.h> 

void myfunc(void); 

const int x = 1; 

int main (int argc, char *argv[]) 
{ 
    printf ("main: value of x: %d\n",x); 
    myfunc(); 
    return 0; 
} 

mp2.c:

#include <stdio.h> 

extern int x; 

void myfunc(void) 
{ 
    printf ("myfunc: value of x: %d\n",x); 
} 

編譯:

gcc -o mp mp1.c mp2.c 

工作正常。現在改變mp1.c使用static const int x = 1;當我們編譯(實際上它的鏈接錯誤),我們得到:

home/user1> gcc -o mp mp1.c mp2.c 
/tmp/ccAeAmzp.o: In function `myfunc': 
mp2.c:(.text+0x7): undefined reference to `x' 
collect2: ld returned 1 exit status 

變量x不mp1.c.的外部可見

這同樣適用於static前綴函數。