2014-09-25 71 views
0

我想知道每個存儲類之間究竟有什麼區別。在這裏我使用了寄存器存儲類。所以我很疑惑,如果我們將register變量聲明爲全局變量,它的範圍是什麼? 在我的代碼中,它給出了沒有爲'x'指定的寄存器名稱。如果有人知道它究竟是什麼意思,並且與其他存儲類相比,寄存器varibale的範圍是多少,請指導我? 謝謝。寄存器存儲類的範圍是什麼?

below is the output of terminal using gcc compiler in Ubuntu. 

[email protected]:~/storageclass$ gcc register.c 
register.c:9:15: error: register name not specified for ‘x’ 
register int x=10; 
     ^
[email protected]:~/storageclass$ gcc register.c 
register.c:9:15: error: register name not specified for ‘x’ 
register int x=10; 
     ^



//int x = 10 ; 
int z; 
int main() 
{ 
    extern int y ; 
    // register int x ; 
    printf ("The value of x is %d \n", x) ; 
    printf ("The value of y is %d",y) ; 
    z=add(); 
    printf("\nvalue of sum is : %d", z); 
    return 0; 

} 
int y = 200 ; 

int add() 
{ 
    int sum; 
    sum=x+y; 
    //printf("value of sum is : %d", sum); 
} 
+0

此錯誤是否屬於發佈代碼? – 2014-09-25 12:54:30

+5

忘記簡單地'註冊'關鍵字。有沒有不忽略該關鍵字的編譯器?正如我記得我看到的最後一個有效代碼是在八十年代初。 ;) – Klaus 2014-09-25 12:55:39

+0

「寄存器變量的範圍對聲明它的塊是本地的。」 – 2014-09-25 12:56:26

回答

3

在標準C register只允許內部的功能,然後將這樣的一個變量爲從它的聲明進行到其中該聲明所在的塊的端部的可見性範圍。

因爲register與您的平臺的硬件寄存器沒有太大關係,所以它是一個不錯的選擇。它的目的是一個優化提示:你不能接受這樣一個變量的地址。

Gcc的擴展名也允許將這些register變量與真實的硬件寄存器相關聯。該擴展名也可用於文件範圍,這是您看到的錯誤消息。

+0

我是沒有得到如何使用寄存器變量。就像它爲什麼只給出這個錯誤。我在函數中使用了註冊,所以它像本地一樣工作。但是當我們把它寫成全局的時候,它可以使用嗎? – 2014-09-25 13:28:53

+0

@ShilpeeDave,正如我所說的,它通常不能在全球範圍內使用。 gcc允許一個特殊的語法將一個'register'關聯到一個硬件寄存器。這個擴展名可以在全局範圍內使用,但是隻有在使用gcc編譯時,其他編譯器才能工作。 – 2014-09-25 13:44:41

0

見標準6.9:

存儲類說明汽車和註冊應在 聲明符不會出現在外部聲明。

「外部聲明」的定義進行說明爲:

如在5.1.1.1所討論的,程序文本的預處理後 單位是翻譯單元,它由一個序列的外部 聲明。這些被描述爲「外部的」,因爲它們出現在任何函數之外(因此具有文件範圍) 。

(不要與的extern關鍵字混淆。)

所以你的代碼是無效的,寄存器變量總是有局部範圍。

請注意,register關鍵字現在已經非常陳舊了:編譯器在決定何時適合將變量存儲在CPU寄存器中比編程人員好得多。